《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之查找文档

《MongoDB入门教程》第06篇 CRUD之创建文档

《MongoDB入门教程》第06篇 CRUD之创建文档

《MongoDB入门教程》第06篇 CRUD之创建文档

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

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