MongoDB中查詢(find操作符)詳細(xì)指南
1. 概述
在本教程中,我們將著眼于執(zhí)行搜索操作以在MongoDB中檢索文檔。MongoDB 提供了一個(gè)find操作符來(lái)從集合中查詢文檔。find運(yùn)算符的主要目的是根據(jù)查詢條件從集合中選擇文檔,并將光標(biāo)返回到所選文檔。
在本教程中,我們將首先查看 MongoDB Shell 查詢中的find運(yùn)算符,然后使用 Java 驅(qū)動(dòng)程序代碼。
2. 數(shù)據(jù)庫(kù)初始化
在我們繼續(xù)執(zhí)行查找操作之前,我們首先需要設(shè)置一個(gè)數(shù)據(jù)庫(kù)baeldung和一個(gè)樣本收集員工:
db.employee.insertMany([ { "employeeId":"EMP1", "name":"Sam", "age":23, "type":"Full Time", "department":"Engineering" }, { "employeeId":"EMP2", "name":"Tony", "age":31, "type":"Full Time", "department":"Admin" }, { "employeeId":"EMP3", "name":"Lisa", "age":42, "type":"Part Time", "department":"Engineering" }]);
成功插入后,上述查詢將返回類似于下圖所示的 JSON 結(jié)果:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("62a88223ff0a77909323a7fa"), ObjectId("62a88223ff0a77909323a7fb"), ObjectId("62a88223ff0a77909323a7fc") ] }
此時(shí),我們已將一些文檔插入到我們的集合中以執(zhí)行各種類型的查找操作。
3. 使用 MongoDB Shell
要從 MongoDB 集合中查詢文檔,我們使用 db.collection.find(query, projection)
方法。該方法接受兩個(gè)可選參數(shù)— 查詢(query) 和 投影(projection) —作為 MongoDB BSON文檔。
查詢參數(shù)接受帶有查詢運(yùn)算符的選擇過(guò)濾器。要從 MongoDB 集合中檢索所有文檔,我們可以省略此參數(shù)或傳遞一個(gè)空白文檔。
接下來(lái),投影參數(shù)用于指定要從匹配文檔返回的字段。要返回匹配文檔中的所有字段,我們可以省略此參數(shù)。
此外,讓我們從返回所有集合文檔的基本查找查詢開始:
db.employee.find({<!--{cke_protected}{C}%3C!%2D%2D%20%2D%2D%3E-->});
上面的查詢將返回員工集合中的所有文檔:
{ "_id" : ObjectId("62a88223ff0a77909323a7fa"), "employeeId" : "1", "name" : "Sam", "age" : 23, "type" : "Full Time", "department" : "Engineering" } { "_id" : ObjectId("62a88223ff0a77909323a7fb"), "employeeId" : "2", "name" : "Tony", "age" : 31, "type" : "Full Time", "department" : "Admin" } { "_id" : ObjectId("62a88223ff0a77909323a7fc"), "employeeId" : "3", "name" : "Ray", "age" : 42, "type" : "Part Time", "department" : "Engineering" }
*接下來(lái),讓我們編寫一個(gè)查詢來(lái)返回屬于“Engineering” *部門的所有員工:
db.employee.find( { "department":"Engineering" });
上述查詢返回部門等于 “Engineering”的所有員工收款單據(jù):
{ "_id" : ObjectId("62a88223ff0a77909323a7fa"), "employeeId" : "1", "name" : "Sam", "age" : 23, "type" : "Full Time", "department" : "Engineering" } { "_id" : ObjectId("62a88223ff0a77909323a7fc"), "employeeId" : "3", "name" : "Ray", "age" : 42, "type" : "Part Time", "department" : "Engineering" }
最后,讓我們編寫一個(gè)查詢來(lái)獲取屬于“Engineering”部門的所有員工的 姓名 和 年齡:
db.employee.find( { "department":"Engineering" }, { "name":1, "age":1 });
上述查詢只返回符合查詢條件的文檔的名稱和年齡字段:
{ "_id" : ObjectId("62a88223ff0a77909323a7fa"), "name" : "Sam", "age" : 23 } { "_id" : ObjectId("62a88223ff0a77909323a7fc"), "name" : "Ray", "age" : 42 }
請(qǐng)注意,除非明確排除,否則所有文檔中默認(rèn)返回_id
字段。
此外,重要的是要注意 find 運(yùn)算符將光標(biāo)返回到與查詢過(guò)濾器匹配的文檔。MongoDB Shell 自動(dòng)迭代光標(biāo)以顯示多達(dá) 20 個(gè)文檔。
此外,MongoDB Shell 提供了一個(gè)*findOne()*方法,該方法只返回一個(gè)滿足上述查詢條件的文檔。如果多個(gè)文檔匹配,則將按照磁盤上文檔的自然順序返回第一個(gè)文檔:
db.employee.findOne();
與*find()*不同,上面的查詢將只返回一個(gè)文檔而不是游標(biāo):
{ "_id" : ObjectId("62a99e22a849e1472c440bbf"), "employeeId" : "EMP1", "name" : "Sam", "age" : 23, "type" : "Full Time", "department" : "Engineering" }
4. 使用 Java 驅(qū)動(dòng)程序
到目前為止,我們已經(jīng)了解了如何使用 MongoDB Shell 來(lái)執(zhí)行查找操作。接下來(lái),讓我們使用 MongoDB Java 驅(qū)動(dòng)程序?qū)崿F(xiàn)相同的功能。在開始之前,讓我們先創(chuàng)建一個(gè)到員工集合的MongoClient連接:
MongoClient mongoClient = new MongoClient("localhost", 27017); MongoDatabase database = mongoClient.getDatabase("baeldung"); MongoCollection<Document> collection = database.getCollection("employee");
在這里,我們創(chuàng)建了到運(yùn)行在默認(rèn)端口 27017 上的 MongoDB 服務(wù)器的連接。接下來(lái),我們從連接創(chuàng)建的*MongoDatabase實(shí)例中獲取MongoCollection的實(shí)例。
首先,要執(zhí)行*查找操作,我們?cè)贛ongoCollection的實(shí)例上調(diào)用 find()
方法。讓我們檢查代碼以從集合中檢索所有文檔:
FindIterable<Document> documents = collection.find(); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
請(qǐng)注意,find()方法返回FindIterable<Document>
的一個(gè)實(shí)例。然后我們通過(guò)調(diào)用 FindIterable 的iterator()方法獲得MongoCursor的一個(gè)實(shí)例。最后,我們遍歷光標(biāo)以檢索每個(gè)文檔。
接下來(lái),讓我們添加查詢運(yùn)算符來(lái)過(guò)濾從查找操作返回的文檔:
Bson filter = Filters.eq("department", "Engineering"); FindIterable<Document> documents = collection.find(filter); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
在這里,我們將Bson過(guò)濾器作為參數(shù)傳遞給find()方法。我們可以使用查詢運(yùn)算符的任意組合作為find()方法的過(guò)濾器。上面的代碼片段將返回department 等于“Engineering”的所有文檔。
此外,讓我們編寫一個(gè)片段,它只返回匹配選擇條件的文檔中的姓名和年齡字段:
Bson filter = Filters.eq("department", "Engineering"); Bson projection = Projections.fields(Projections.include("name", "age")); FindIterable<Document> documents = collection.find(filter) .projection(projection); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
在這里,我們調(diào)用FindIterable實(shí)例的projection()方法。我們將Bson過(guò)濾器作為參數(shù)傳遞給*projection()*方法。我們可以使用投影操作在最終結(jié)果中包含或排除任何字段。
最后,我們可以使用FindIterable實(shí)例上的first()方法檢索結(jié)果的第一個(gè)文檔。這將返回單個(gè)文檔而不是MongoCursor實(shí)例:
FindIterable<Document> documents = collection.find(); Document document = documents.first();
5. 結(jié)論
在本文中,我們學(xué)習(xí)了使用各種方法在 MongoDB 中執(zhí)行查找操作。我們執(zhí)行find以使用查詢運(yùn)算符檢索與選擇標(biāo)準(zhǔn)匹配的特定文檔。此外,我們還學(xué)習(xí)了執(zhí)行投影以確定匹配文檔中返回的字段。
首先,我們研究了 MongoDB Shell 查詢中find*操作的用例,然后討論了相應(yīng)的 Java 驅(qū)動(dòng)程序代碼。
到此這篇關(guān)于MongoDB中查詢(find操作符)的文章就介紹到這了,更多相關(guān)MongoDB查詢find操作符內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MongoDB??數(shù)據(jù)模型的設(shè)計(jì)模式及優(yōu)缺點(diǎn)
這篇文章主要介紹了MongoDB??數(shù)據(jù)模型的設(shè)計(jì)模式,在實(shí)際開發(fā)中,大多數(shù)性能問(wèn)題都可以追溯到糟糕的模型設(shè)計(jì),官方也提供分享過(guò)文檔模型設(shè)計(jì)的進(jìn)階技巧,這里簡(jiǎn)單翻譯記錄一下,需要的朋友可以參考下2022-12-12MongoDB 3.4 安裝以 Windows 服務(wù)方式運(yùn)行的詳細(xì)步驟
這篇文章主要介紹了MongoDB 3.4 安裝以 Windows 服務(wù)方式運(yùn)行的詳細(xì)步驟,需要的朋友可以參考下2017-09-09MongoDB模糊查詢正則regex(類似like?和?not?like)
在類關(guān)系型數(shù)據(jù)庫(kù)中,like和not?like是常用的模糊查詢操作符,它允許我們?cè)谄ヅ渥侄蔚臅r(shí)候使用通配符,在MongoDB中,也有類似的操作符,MongoDB?可以使用?$regex?操作符來(lái)設(shè)置匹配字符串的正則表達(dá)式,MongoDB?使用?PCRE(Perl?兼容的正則表達(dá)式)作為正則表達(dá)式語(yǔ)言2024-02-02Centos 7下Mongodb開機(jī)無(wú)法自啟動(dòng)的解決方法
這篇文章主要介紹了Centos 7下Mongodb開機(jī)無(wú)法自啟動(dòng)的解決方法,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03MongoDB中創(chuàng)建索引需要注意的事項(xiàng)
這篇文章主要介紹了MongoDB中創(chuàng)建索引需要注意的事項(xiàng),本文講解了創(chuàng)建索引可能會(huì)引發(fā)的問(wèn)題并給出解決方法,需要的朋友可以參考下2015-03-03MongoDB系列教程(三):Windows中下載和安裝MongoDB
這篇文章主要介紹了MongoDB系列教程(三):MongoDB下載和安裝,本文講解使用Windows環(huán)境安裝MongoDB,需要的朋友可以參考下2015-05-05使用aggregate在MongoDB中查詢重復(fù)數(shù)據(jù)記錄的方法
這篇文章主要介紹了使用aggregate在MongoDB中查詢重復(fù)數(shù)據(jù)記錄的方法的相關(guān)資料,需要的朋友可以參考下2016-01-01MongoDB系列教程(六):java操作mongodb實(shí)例
這篇文章主要介紹了MongoDB系列教程(六):java操作mongodb實(shí)例,本文講解了java中操作mongodb數(shù)據(jù)增加、刪除、修改、查詢數(shù)據(jù)等代碼實(shí)例,需要的朋友可以參考下2015-05-05