本文将会介绍如何利用集合的 findOne() 和 find() 方法查找文档。

使用 findOne() 方法查找单个文档

findOne() 方法用于返回集合中满足条件的单个文档,该方法的语法如下:

db.collection.findOne(query, projection)

findOne() 方法包含两个可选的参数:

  • query 用于指定一个选择标准;
  • projection 用于指定返回的字段。

如果省略 query 参数,findOne() 返回磁盘中存储的第一个文档。如果省略 projection 参数,默认返回文档中的全部字段。

如果想要指定是否返回某个字段,可以使用以下格式指定 projection 参数:

{field1: value, field1: value, ... }

其中,value 设置为 true 或者 1 表示返回该字段;如果 value 设置为 false 或者 0,MongoDB 不会返回该字段。

默认情况下,MongoDB 总是返回 _id 字段。如果不需要返回该字段,可以在 projection 参数中明确指定 _id: 0。

如果存在多个满足查询条件的文档,findOne() 只会返回磁盘中找到的第一个文档。

接下来我们看几个示例,首先创建一个集合 products:

db.products.insertMany([{ "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate": ISODate("2011-05-14"), "spec" : { "ram" : 4, "screen" : 6.5, "cpu" : 2.66 },"color":["white","black"],"storage":[64,128,256]},{ "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate": ISODate("2011-09-01") , "spec" : { "ram" : 16, "screen" : 9.5, "cpu" : 3.66 },"color":["white","black","purple"],"storage":[128,256,512]},{ "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate": ISODate("2015-01-14"), "spec" : { "ram" : 12, "screen" : 9.7, "cpu" : 3.66 },"color":["blue"],"storage":[16,64,128]},{ "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate": ISODate("2020-05-14"),"spec" : { "ram" : 8, "screen" : 9.7, "cpu" : 1.66 },"color":["white","orange","gold","gray"],"storage":[128,256,1024]},{ "_id" : 5, "name" : "SmartPhone", "price" : 599,"releaseDate": ISODate("2022-09-14"), "spec" : { "ram" : 4, "screen" : 5.7, "cpu" : 1.66 },"color":["white","orange","gold","gray"],"storage":[128,256]}])

以下示例使用 findOne() 方法查找集合 products 中的第一个文档:

db.products.findOne()

查询返回了文档中的全部字段:

{_id: 1,name: 'xPhone',price: 799,releaseDate: ISODate("2011-05-14T00:00:00.000Z"),spec: { ram: 4, screen: 6.5, cpu: 2.66 },color: [ 'white', 'black' ],storage: [ 64, 128, 256 ]
}

省略 query 参数和指定一个空文档参数的结果相同:

db.products.findOne({})

以下语句使用 findOne() 方法查找 _id 等于 2 的文档:

 db.products.findOne({_id:2})

返回结果如下:

{_id: 2,name: 'xTablet',price: 899,releaseDate: ISODate("2011-09-01T00:00:00.000Z"),spec: { ram: 16, screen: 9.5, cpu: 3.66 },color: [ 'white', 'black', 'purple' ],storage: [ 128, 256, 512 ]
}

以下示例使用 findOne() 方法查找 _id 等于 5 的文档,并且只返回了 _id 和 name 字段:

db.products.findOne({_id: 5}, {name: 1}){ "_id" : 5, "name" : "SmartPhone" }

从返回结果可以看出,MongoDB 默认返回了 _id 字段。

如果想要从返回结果中去掉 _id 字段,可以明确指定 _id:0,例如:

db.products.findOne({ _id: 5 }, {name: 1, _id: 0}){ "name" : "SmartPhone" }

使用 find() 方法查找文档

find() 方法用于查找满足指定条件的文档,并且返回一个指向这些文档的游标(指针)。该方法的语法如下:

db.collection.find(query, projection)

find() 方法包含两个可选的参数:

  • query 用于指定一个选择标准。如果省略该参数或者指定一个空文档参数,将会返回集合中的全部文档。
  • projection 用于指定返回的字段。如果省略该参数,将会返回文档中的全部字段。

默认情况下,MongoDB 总是返回 _id 字段。如果不需要返回该字段,可以在 projection 参数中明确指定 _id: 0。

由于 mongo shell 自动遍历 find() 方法返回的游标,我们不需要执行额外的操作就可以获取游标中的文档。默认情况下,mongo shell 只显示前 20 篇文档,输入 it 命令可以显示更多文档。

下面我们使用一个新的集合 books 作为演示:

db.books.insertMany([{ "_id" : 1, "title" : "Unlocking Android", "isbn" : "1933988673", "categories" : [ "Open Source", "Mobile" ] },{ "_id" : 2, "title" : "Android in Action, Second Edition", "isbn" : "1935182722", "categories" : [ "Java" ] },{ "_id" : 3, "title" : "Specification by Example", "isbn" : "1617290084", "categories" : [ "Software Engineering" ] },{ "_id" : 4, "title" : "Flex 3 in Action", "isbn" : "1933988746", "categories" : [ "Internet" ] },{ "_id" : 5, "title" : "Flex 4 in Action", "isbn" : "1935182420", "categories" : [ "Internet" ] },{ "_id" : 6, "title" : "Collective Intelligence in Action", "isbn" : "1933988312", "categories" : [ "Internet" ] },{ "_id" : 7, "title" : "Zend Framework in Action", "isbn" : "1933988320", "categories" : [ "Web Development" ] },{ "_id" : 8, "title" : "Flex on Java", "isbn" : "1933988797", "categories" : [ "Internet" ] },{ "_id" : 9, "title" : "Griffon in Action", "isbn" : "1935182234", "categories" : [ "Java" ] },{ "_id" : 10, "title" : "OSGi in Depth", "isbn" : "193518217X", "categories" : [ "Java" ] },{ "_id" : 11, "title" : "Flexible Rails", "isbn" : "1933988509", "categories" : [ "Web Development" ] },{ "_id" : 13, "title" : "Hello! Flex 4", "isbn" : "1933988762", "categories" : [ "Internet" ] },{ "_id" : 14, "title" : "Coffeehouse", "isbn" : "1884777384", "categories" : [ "Miscellaneous" ] },{ "_id" : 15, "title" : "Team Foundation Server 2008 in Action", "isbn" : "1933988592", "categories" : [ "Microsoft .NET" ] },{ "_id" : 16, "title" : "Brownfield Application Development in .NET", "isbn" : "1933988711", "categories" : [ "Microsoft" ] },{ "_id" : 17, "title" : "MongoDB in Action", "isbn" : "1935182870", "categories" : [ "Next Generation Databases" ] },{ "_id" : 18, "title" : "Distributed Application Development with PowerBuilder 6.0", "isbn" : "1884777686", "categories" : [ "PowerBuilder" ] },{ "_id" : 19, "title" : "Jaguar Development with PowerBuilder 7", "isbn" : "1884777864", "categories" : [ "PowerBuilder", "Client-Server" ] },{ "_id" : 20, "title" : "Taming Jaguar", "isbn" : "1884777686", "categories" : [ "PowerBuilder" ] },{ "_id" : 21, "title" : "3D User Interfaces with Java 3D", "isbn" : "1884777902", "categories" : [ "Java", "Computer Graphics" ] },{ "_id" : 22, "title" : "Hibernate in Action", "isbn" : "193239415X", "categories" : [ "Java" ] },{ "_id" : 23, "title" : "Hibernate in Action (Chinese Edition)", "categories" : [ "Java" ] },{ "_id" : 24, "title" : "Java Persistence with Hibernate", "isbn" : "1932394885", "categories" : [ "Java" ] },{ "_id" : 25, "title" : "JSTL in Action", "isbn" : "1930110529", "categories" : [ "Internet" ] },{ "_id" : 26, "title" : "iBATIS in Action", "isbn" : "1932394826", "categories" : [ "Web Development" ] },{ "_id" : 27, "title" : "Designing Hard Software", "isbn" : "133046192", "categories" : [ "Object-Oriented Programming", "S" ] },{ "_id" : 28, "title" : "Hibernate Search in Action", "isbn" : "1933988649", "categories" : [ "Java" ] },{ "_id" : 29, "title" : "jQuery in Action", "isbn" : "1933988355", "categories" : [ "Web Development" ] },{ "_id" : 30, "title" : "jQuery in Action, Second Edition", "isbn" : "1935182323", "categories" : [ "Java" ] }
]);

以下示例使用不带参数的 find() 方法返回集合 books 中的全部文档:

db.books.find()

mongo shell 显示了前 20 篇文档,包含了全部字段。输入 it 命令并回车,将会看到后续 20 篇文档。

以下示例返回了 _id 等于 10 的文档,包含了文档的全部字段:

db.books.find({_id: 10})[{_id: 10,title: 'OSGi in Depth',isbn: '193518217X',categories: [ 'Java' ]}
]

以下示例返回了 category 等于“Java”的所有文档,返回结果中包含了 _id、title 以及 isbn 三个字段:

db.books.find({ categories: 'Java'}, { title: 1,isbn: 1})[{_id: 2,title: 'Android in Action, Second Edition',isbn: '1935182722'},{ _id: 9, title: 'Griffon in Action', isbn: '1935182234' },{ _id: 10, title: 'OSGi in Depth', isbn: '193518217X' },{_id: 21,title: '3D User Interfaces with Java 3D',isbn: '1884777902'},{ _id: 22, title: 'Hibernate in Action', isbn: '193239415X' },{ _id: 23, title: 'Hibernate in Action (Chinese Edition)' },{_id: 24,title: 'Java Persistence with Hibernate',isbn: '1932394885'},{ _id: 28, title: 'Hibernate Search in Action', isbn: '1933988649' },{_id: 30,title: 'jQuery in Action, Second Edition',isbn: '1935182323'}
]

利用投影操作返回指定字段

在 MongoDB 中,投影(projection)表示在查询中返回指定的字段。

默认情况下 find() 和 findOne() 方法会返回文档中的全部字段,但是大多数情况下我们不需要查询全部字段。

如果想要选择返回某些字段,可以在一个文档中指定这些字段并将该文档作为参数传递给 find() 和 findOne() 方法。该参数文档被称为投影文档。指定返回字段的语法如下:

{ <field>: value, ...}

如果 value 设置为 1 或者 true,表示返回字段 ;如果 value 设置为 0 或者 false,表示不返回该字段。如果投影文档为空({}),表示返回全部字段。

对于嵌入式文档中的字段,可以使用点号指定:

{ "<embeddedDocument>.<field>": value, ... }

以下示例返回了 _id 等于 1 的文档中的 name、price 以及 _id 字段,同时还返回了嵌入式文档 spec 中的 screen 字段:

db.products.find({_id:1}, {name: 1,price: 1,"spec.screen": 1
})

输出结果如下:

[ { _id: 1, name: 'xPhone', price: 799, spec: { screen: 6.5 } } ]

MongoDB 4.4 以及更高版本还支持嵌套形式指定返回的字段:

db.products.find({_id:1}, {name: 1,price: 1,spec : { screen: 1 }
})

与此类似,对于数组中的字段,也可以使用点号指定:

{ "<arrayField>.field": value, ...}

以下示例返回了 _id、name 以及数组 inventory 中的 qty 字段:

db.products.find({}, {name: 1,"inventory.qty": 1
});

输出结果如下:

[{ _id: 1, name: 'xPhone', inventory: [ { qty: 1200 } ] },{ _id: 2, name: 'xTablet', inventory: [ { qty: 300 } ] },{_id: 3, name: 'SmartTablet', inventory: [ { qty: 400 }, { qty: 200 } ]},{ _id: 4, name: 'SmartPad', inventory: [ { qty: 1200 } ] },{ _id: 5, name: 'SmartPhone' }
]

《MongoDB入门教程》第07篇 CRUD之查找文档相关推荐

  1. 《MongoDB入门教程》第14篇 CRUD之更新文档

    本篇我们将会介绍如何使用集合的 updateOne() 和 updateMany() 方法更新文档. updateOne() 方法 updateOne() 方法可以更新满足条件的单个文档,语法如下: ...

  2. 医疗影像工具LEADTOOLS 入门教程: 在 Windows 服务器上部署 LEADTOOLS 文档服务 - .NET Framework

    LEADTOOLS是一个综合工具包的集合,用于将识别.文档.医疗.成像和多媒体技术整合到桌面.服务器.平板电脑.网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和 ...

  3. 《MongoDB入门教程》第21篇 CRUD之删除文档

    本文将会介绍如何利用 deleteOne() 和 deleteMany() 方法删除满足指定条件的文档. deleteOne() 方法 deleteOne() 方法用于删除集合中的单个文档,语法如下: ...

  4. 《MongoDB入门教程》第04篇 MongoDB客户端

    本篇我们介绍 MongoDB 客户端工具 mongo 的使用. mongo shell mongo shell 是一个用于连接 MongoDB 的交互式 JavaScript 接口.mongo she ...

  5. 《MongoDB入门教程》第08篇 比较运算符

    本文将会介绍 MongoDB 中查找文档时常用的一些比较运算符,包括 $eq.$gt.$gte.$lt.$lte.$ne.$in 以及 $nin. $eq 运算符 $eq 运算符用于匹配字段等于(=) ...

  6. 《MongoDB入门教程》第19篇 文档更新之$rename操作符

    本文将会介绍 MongoDB $rename 操作符,它可以用于重命名文档中的字段. $rename 操作符 $rename 是一个字段更新操作符,可以用于修改文档的字段名. $rename 操作符的 ...

  7. Systemd 入门教程:实战篇

    Systemd 入门教程:实战篇 原文出处: 阮一峰(@ruanyf)   http://blog.jobbole.com/98671/?utm_source=blog.jobbole.com& ...

  8. Linux Capabilities 入门教程--进阶实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

  9. Linux Capabilities 入门教程--基础实战篇

    该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...

最新文章

  1. 云尚制片管理系统_电影制片厂的未来
  2. 计算机论文答辩注意哪些问题,计算机专业论文答辩(准备和注意事项)
  3. RTT的线程同步篇——信号量
  4. php获取工作日时间,ThinkPHP中获取指定日期后工作日的具体日期方法
  5. 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
  6. sql2005数据库备份—sql语句
  7. 小贝_redis高级应用-公布与订阅
  8. [2018.03.14 T1] 矩阵(matrix)
  9. Linux下C语言编程(1):IO编程
  10. 基于docker搭开源iredmail邮箱服务器
  11. Glide加载圆形图片并且带边框
  12. Using setJavaScriptEnabled can introduce XSS vulnerabilities into you application
  13. java下载网站图片代码_java下载网上的图片到本地
  14. Nordic错误笔记
  15. 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割
  16. 硬件实施 关于基恩士SR2000电源线的接法
  17. 基于百万级别的站内信设计
  18. VC/PE乐见:简化基金注册程序,鼓励险资流向股权投资...
  19. 手把手教学京东api接口全部操作过程
  20. 软件工程顶级会议中的自动修复工具——JFIX [ISSTA 2017]

热门文章

  1. 游戏锁30帧会不会更具电影质感?
  2. 什么是区块链项目“白皮书”?
  3. CF1189B Number Circle(数字圈)
  4. 【技术】PWA实践 - 应用激活与安装
  5. CMU 15213(已搁置)
  6. 百度站长平台使用教程:普通收录
  7. android百度地图显示某个地区,百度地图api只显示某个省市的行政区域
  8. html一张图片水平居中,CSS 图片水平居中
  9. AutoCAD Electrical 2022—导线的绘制
  10. 厦门科技馆摆木块问题