《MongoDB入门教程》第07篇 CRUD之查找文档
Posted 不剪发的Tony老师
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《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《MongoDB入门教程》第07篇 CRUD之查找文档