拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 在MongoDB 中查找的指南

在MongoDB 中查找的指南

白鹭 - 2022-07-05 2155 0 2

一、概述

在本教程中,我们将着眼于执行搜索操作以在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)方法。该方法接受两个可选参数——queryprojection——作为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的所有员工的nameage

db.employee.find(
{
"department":"Engineering"
},
{
"name":1,
"age":1
});

上述查询只返回符合查询条件的文档的nameage字段:

{ "_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等于“工程”的所有文档。

此外,让我们编写一个片段,它只返回匹配选择条件的文档中的nameage字段:

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 驱动程序代码。


标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *