这篇“MongoDB中find操作符怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MongoDB中find操作符怎么使用”文章吧。
数据库初始化
在我们继续执行查找操作之前,我们首先需要设置一个数据库baeldung和一个样本收集员工:
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") ] }
此时,我们已将一些文档插入到我们的集合中以执行各种类型的查找操作。
使用 MongoDB Shell
要从 MongoDB 集合中查询文档,我们使用
db.collection.find(query, projection)方法。该方法接受两个可选参数— 查询(query) 和 投影(projection) —作为 MongoDB BSON文档。
查询参数接受带有查询运算符的选择过滤器。要从 MongoDB 集合中检索所有文档,我们可以省略此参数或传递一个空白文档。
接下来,投影参数用于指定要从匹配文档返回的字段。要返回匹配文档中的所有字段,我们可以省略此参数。
此外,让我们从返回所有集合文档的基本查找查询开始:
db.employee.find({});
上面的查询将返回员工集合中的所有文档:
{ "_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” *部门的所有员工:
db.employee.find({ "department":"Engineering"});
上述查询返回部门等于 “Engineering”的所有员工收款单据:
{ "_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”部门的所有员工的 姓名 和 年龄:
db.employee.find({ "department":"Engineering"},{ "name":1, "age":1});
上述查询只返回符合查询条件的文档的名称和年龄字段:
{ "_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 来执行查找操作。接下来,让我们使用 MongoDB Java 驱动程序实现相同的功能。在开始之前,让我们先创建一个到员工集合的MongoClient连接:
MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase database = mongoClient.getDatabase("baeldung");MongoCollection<Document> collection = database.getCollection("employee");
在这里,我们创建了到运行在默认端口 27017 上的 MongoDB 服务器的连接。接下来,我们从连接创建的*MongoDatabase实例中获取MongoCollection的实例。
首先,要执行*查找操作,我们在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的一个实例。最后,我们遍历光标以检索每个文档。
接下来,让我们添加查询运算符来过滤从查找操作返回的文档:
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 等于“Engineering”的所有文档。
此外,让我们编写一个片段,它只返回匹配选择条件的文档中的姓名和年龄字段:
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()*方法。我们可以使用投影操作在最终结果中包含或排除任何字段。
最后,我们可以使用FindIterable实例上的first()方法检索结果的第一个文档。这将返回单个文档而不是MongoCursor实例:
FindIterable<Document> documents = collection.find();Document document = documents.first();