《MongoDB入门教程》第07篇 CRUD之查找文档
本文将会介绍如何利用集合的 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之查找文档相关推荐
- 《MongoDB入门教程》第14篇 CRUD之更新文档
本篇我们将会介绍如何使用集合的 updateOne() 和 updateMany() 方法更新文档. updateOne() 方法 updateOne() 方法可以更新满足条件的单个文档,语法如下: ...
- 医疗影像工具LEADTOOLS 入门教程: 在 Windows 服务器上部署 LEADTOOLS 文档服务 - .NET Framework
LEADTOOLS是一个综合工具包的集合,用于将识别.文档.医疗.成像和多媒体技术整合到桌面.服务器.平板电脑.网络和移动解决方案中,是一项企业级文档自动化解决方案,有捕捉,OCR,OMR,表单识别和 ...
- 《MongoDB入门教程》第21篇 CRUD之删除文档
本文将会介绍如何利用 deleteOne() 和 deleteMany() 方法删除满足指定条件的文档. deleteOne() 方法 deleteOne() 方法用于删除集合中的单个文档,语法如下: ...
- 《MongoDB入门教程》第04篇 MongoDB客户端
本篇我们介绍 MongoDB 客户端工具 mongo 的使用. mongo shell mongo shell 是一个用于连接 MongoDB 的交互式 JavaScript 接口.mongo she ...
- 《MongoDB入门教程》第08篇 比较运算符
本文将会介绍 MongoDB 中查找文档时常用的一些比较运算符,包括 $eq.$gt.$gte.$lt.$lte.$ne.$in 以及 $nin. $eq 运算符 $eq 运算符用于匹配字段等于(=) ...
- 《MongoDB入门教程》第19篇 文档更新之$rename操作符
本文将会介绍 MongoDB $rename 操作符,它可以用于重命名文档中的字段. $rename 操作符 $rename 是一个字段更新操作符,可以用于修改文档的字段名. $rename 操作符的 ...
- Systemd 入门教程:实战篇
Systemd 入门教程:实战篇 原文出处: 阮一峰(@ruanyf) http://blog.jobbole.com/98671/?utm_source=blog.jobbole.com& ...
- Linux Capabilities 入门教程--进阶实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...
- Linux Capabilities 入门教程--基础实战篇
该系列文章总共分为三篇: Linux Capabilities 入门教程:概念篇 Linux Capabilities 入门教程:基础实战篇 Linux Capabilities 入门教程:进阶实战篇 ...
最新文章
- 云尚制片管理系统_电影制片厂的未来
- 计算机论文答辩注意哪些问题,计算机专业论文答辩(准备和注意事项)
- RTT的线程同步篇——信号量
- php获取工作日时间,ThinkPHP中获取指定日期后工作日的具体日期方法
- 朱晔和你聊Spring系列S1E9:聊聊Spring的那些注解
- sql2005数据库备份—sql语句
- 小贝_redis高级应用-公布与订阅
- [2018.03.14 T1] 矩阵(matrix)
- Linux下C语言编程(1):IO编程
- 基于docker搭开源iredmail邮箱服务器
- Glide加载圆形图片并且带边框
- Using setJavaScriptEnabled can introduce XSS vulnerabilities into you application
- java下载网站图片代码_java下载网上的图片到本地
- Nordic错误笔记
- 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割
- 硬件实施 关于基恩士SR2000电源线的接法
- 基于百万级别的站内信设计
- VC/PE乐见:简化基金注册程序,鼓励险资流向股权投资...
- 手把手教学京东api接口全部操作过程
- 软件工程顶级会议中的自动修复工具——JFIX [ISSTA 2017]