《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之查找文档的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [原创]HP DV2 1005AU 装机
- 下一篇: SCJP考题中的陷阱---来自水木清华B