在 MongoDB 中查找的指南
一、概述
在本教程中,我們將著眼於執行搜索操作以在MongoDB中檢索文檔。 MongoDB 提供了一個find
操作符來從集合中查詢文檔。 find
運算符的主要目的是根據查詢條件從集合中選擇文檔,並將光標返回到所選文檔。
在本教程中,我們將首先查看 MongoDB Shell 查詢中的find
運算符,然後使用 Java 驅動程序代碼。
2. 數據庫初始化
在我們繼續執行find
操作之前,我們首先需要設置一個數據庫baeldung
和一個樣本收集employee
:
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 結果:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("62a88223ff0a77909323a7fa"),
ObjectId("62a88223ff0a77909323a7fb"),
ObjectId("62a88223ff0a77909323a7fc")
]
}
此時,我們已將一些文檔插入到我們的集合中以執行各種類型的find
操作。
3. 使用 MongoDB Shell
要從 MongoDB 集合中查詢文檔,我們使用db.collection.find(query, projection)
方法。該方法接受兩個可選參數—— query
和projection
——作為 MongoDB BSON 文檔。
query
參數接受帶有查詢運算符的選擇過濾器。要從 MongoDB 集合中檢索所有文檔,我們可以省略此參數或傳遞一個空白文檔。
接下來, projection
參數用於指定要從匹配文檔返回的字段。要返回匹配文檔中的所有字段,我們可以省略此參數。
此外,讓我們從返回所有集合文檔的基本find
查詢開始:
db.employee.find({});
上面的查詢將返回employee
集合中的所有文檔:
{ "_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" }
接下來,讓我們編寫一個查詢來返回屬於“Engineering”
department
的所有員工:
db.employee.find(
{
"department":"Engineering"
});
上述查詢返回department
等於“ Engineering”
的所有employee
收款單據:
{ "_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" }
最後,讓我們編寫一個查詢來獲取屬於“Engineering” department
的所有員工的name
和age
:
db.employee.find(
{
"department":"Engineering"
},
{
"name":1,
"age":1
});
上述查詢只返回符合查詢條件的文檔的name
和age
字段:
{ "_id" : ObjectId("62a88223ff0a77909323a7fa"), "name" : "Sam", "age" : 23 }
{ "_id" : ObjectId("62a88223ff0a77909323a7fc"), "name" : "Ray", "age" : 42 }
請注意,除非明確排除,否則所有文檔中默認返回_id
字段。
此外,重要的是要注意**find
運算符將光標返回到與查詢過濾器匹配的文檔**。 MongoDB Shell 自動迭代光標以顯示多達 20 個文檔。
此外,MongoDB Shell 提供了一個**findOne()
方法,該方法只返回一個滿足上述查詢條件的文檔**。如果多個文檔匹配,則將按照磁盤上文檔的自然順序返回第一個文檔:
db.employee.findOne();
與find()
不同,上面的查詢將只返回一個文檔而不是游標:
{
"_id" : ObjectId("62a99e22a849e1472c440bbf"),
"employeeId" : "EMP1",
"name" : "Sam",
"age" : 23,
"type" : "Full Time",
"department" : "Engineering"
}
4. 使用 Java 驅動程序
到目前為止,我們已經了解瞭如何使用 MongoDB Shell 來執行find
操作。接下來,讓我們使用 MongoDB Java 驅動程序實現相同的功能。在開始之前,讓我們先創建一個到employee
集合的MongoClient
連接:
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("baeldung");
MongoCollection<Document> collection = database.getCollection("employee");
在這裡,我們創建了到運行在默認端口 27017 上的 MongoDB 服務器的連接。接下來,我們從連接創建的MongoDatabase
實例中獲取MongoCollection
的實例。
首先,要執行find
操作,我們在MongoCollection
的實例上調用find()
方法。讓我們檢查代碼以從集合中檢索所有文檔:
FindIterable<Document> documents = collection.find();
MongoCursor<Document> cursor = documents.iterator();
while (cursor.hasNext()) {
System.out.println(cursor.next());
}
請注意, find()
方法返回FindIterable<Document>
的一個實例。然後我們通過調用 FindIterable 的iterator()
方法獲得MongoCursor
的一個實例FindIterable.
最後,我們遍歷光標以檢索每個文檔。
接下來,讓我們添加查詢運算符來過濾從find
操作返回的文檔:
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
過濾器作為參數傳遞給find()
方法。我們可以使用查詢運算符的任意組合作為find()
方法的過濾器。上面的代碼片段將返回department
等於“工程”的所有文檔。
此外,讓我們編寫一個片段,它只返回匹配選擇條件的文檔中的name
和age
字段:
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());
}
在這裡,我們調用FindIterable
實例的projection()
方法。我們將Bson
過濾器作為參數傳遞給projection()
方法。我們可以使用projection
操作在最終結果中包含或排除任何字段。作為直接使用 MongoDB 驅動程序和Bson
的替代方法,請查看我們的 Spring Data MongoDB 投影指南。
最後,我們可以使用FindIterable
實例上的first()
方法檢索結果的第一個文檔。這將返回單個文檔而不是MongoCursor
實例:
FindIterable<Document> documents = collection.find();
Document document = documents.first();
5. 結論
在本文中,我們學習了使用各種方法在 MongoDB 中執行find
操作。我們執行find
以使用查詢運算符檢索與選擇標準匹配的特定文檔。此外,我們還學習了執行projection
以確定匹配文檔中返回的字段。
首先,我們研究了 MongoDB Shell 查詢中find
操作的用例,然後討論了相應的 Java 驅動程序代碼。
所有這些示例和代碼片段的實現都可以在 GitHub 上找到。