一、概述
在本教程中,我们将研究在MongoDB 中使用Document ID 执行查询操作。MongoDB 提供了一个find
操作符来从集合中查询文档。
在本教程中,我们将首先查看在MongoDB Shell 查询中使用Document ID 查询文档,然后使用Java 驱动程序代码。
2. MongoDB Document 的Document ID 是什么?
就像任何其他数据库管理系统一样,MongoDB 要求存储在集合中的每个文档都有一个唯一标识符。此唯一标识符充当集合的主键。
在MongoDB 中,ID 由12 个字节组成:
一个4 字节的时间戳,表示自Unix 纪元以来ID 的创建时间,以秒为单位
机器和进程唯一的5 字节随机生成值
一个3 字节递增计数器
在MongoDB 中,ID 存储在名为_id
的字段中,由客户端生成。因此,应在将文档发送到数据库之前生成ID。在客户端,我们可以使用驱动程序生成的ID 或生成自定义ID。
唯一标识符存储在ObjectId
类中。这个类提供了方便的方法来获取存储在ID 中的数据,而无需实际解析它。如果在插入文档时未指定_id
,MongoDB 将添加_id
字段并为文档分配唯一的ObjectId
。
3. 数据库初始化
首先,让我们建立一个新的数据库baeldung
和一个样本集合,vehicle
:
use baeldung; db.createCollection("vehicle");
此外,让我们使用insertMany
方法将一些文档添加到集合中:
db.vehicle.insertMany([ { "companyName":"Skoda", "modelName":"Octavia", "launchYear":2016, "type":"Sports", "registeredNo":"SKO 1134" }, { "companyName":"BMW", "modelName":"X5", "launchYear":2020, "type":"SUV", "registeredNo":"BMW 3325" }, { "companyName":"Mercedes", "modelName":"Maybach", "launchYear":2021, "type":"Luxury", "registeredNo":"MER 9754" }]);
如果插入成功,上面的命令将打印一个类似于下图的JSON:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("62d01d17cdd1b7c8a5f945b9"), ObjectId("62d01d17cdd1b7c8a5f945ba"), ObjectId("62d01d17cdd1b7c8a5f945bb") ] }
我们已成功设置数据库和集合。我们将在所有示例中使用这个数据库和集合。
4. 使用MongoDB Shell
我们将使用db.collection.find(query, projection)
方法从MongoDB 中查询文档。
首先,让我们编写一个返回所有vehicle
集合文档的查询:
db.vehicle.find({});
上面的查询返回所有文档:
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda", "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" } { "_id" : ObjectId("62d01d17cdd1b7c8a5f945ba"), "companyName" : "BMW", "modelName" : "X5", "launchYear" : 2020, "type" : "SUV", "registeredNo" : "BMW 3325" } { "_id" : ObjectId("62d01d17cdd1b7c8a5f945bb"), "companyName" : "Mercedes", "modelName" : "Maybach", "launchYear" : 2021, "type" : "Luxury", "registeredNo" : "MER 9754" }
此外,让我们编写一个查询来使用上面结果中返回的ID 获取vehicle
集合文档:
db.vehicle.find( { "_id": ObjectId("62d01d17cdd1b7c8a5f945b9") });
上述查询返回vehicle
集合文档,_id
等于ObjectId(“62d01d17cdd1b7c8a5f945b9”)
:
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda", "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" }
此外,我们可以使用带有in
查询运算符的ID 检索多个vehicle
收集文档:
db.vehicle.find( { "_id": { $in: [ ObjectId("62d01d17cdd1b7c8a5f945b9"), ObjectId("62d01d17cdd1b7c8a5f945ba"), ObjectId("62d01d17cdd1b7c8a5f945bb") ] } });
上述查询返回in
操作符中查询到的ID 的所有vehicle
收集文档:
{ "_id" : ObjectId("62d01d17cdd1b7c8a5f945b9"), "companyName" : "Skoda", "modelName" : "Octavia", "launchYear" : 2016, "type" : "Sports", "registeredNo" : "SKO 1134" } { "_id" : ObjectId("62d01d17cdd1b7c8a5f945ba"), "companyName" : "BMW", "modelName" : "X5", "launchYear" : 2020, "type" : "SUV", "registeredNo" : "BMW 3325" } { "_id" : ObjectId("62d01d17cdd1b7c8a5f945bb"), "companyName" : "Mercedes", "modelName" : "Maybach", "launchYear" : 2021, "type" : "Luxury", "registeredNo" : "MER 9754" }
同样,任何查询运算符都可以用作带有要查询的ID 的find()
方法的过滤器。
此外,需要注意的是,在使用_id
字段查询文档时,文档ID 字符串值应指定为ObjectId()
而不是String
。
让我们尝试使用ID 作为String
值来查询现有文档:
db.vehicle.find( { "_id": "62d01d17cdd1b7c8a5f945b9" });
不幸的是,上述查询不会返回任何文档,因为不存在任何ID 为String
值为62d01d17cdd1b7c8a5f945b9
的文档。
5. 使用Java 驱动程序
到目前为止,我们已经学习了如何在MongoDB Shell 中使用ID 来查询文档。现在让我们使用MongoDB Java 驱动程序实现相同的功能。
在执行更新操作之前,我们先连接到baeldung
数据库中的vehicle
集合:
MongoClient mongoClient = new MongoClient("localhost", 27017); MongoDatabase database = mongoClient.getDatabase("baeldung"); MongoCollection<Document> collection = database.getCollection("vehicle");
在这里,在这种情况下,我们连接到MongoDB,它在localhost 的默认端口27017 上运行。
首先,让我们编写使用ID 查询文档的代码:
Bson filter = Filters.eq("_id", new ObjectId("62d01d17cdd1b7c8a5f945b9")); FindIterable<Document> documents = collection.find(filter); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
在这里,我们将Bson
过滤器作为参数传递给带有_id
字段的find()
方法进行查询。上面的代码片段将返回_id
等于ObjectId(“62d01d17cdd1b7c8a5f945b9”)
的vehicle
收集文档。
此外,让我们编写一个片段来查询具有多个ID 的文档:
Bson filter = Filters.in("_id", new ObjectId("62d01d17cdd1b7c8a5f945b9"), new ObjectId("62d01d17cdd1b7c8a5f945ba")); FindIterable<Document> documents = collection.find(filter); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
上述查询返回查询到的ID 的所有vehicle
收集文档。
最后,让我们尝试使用驾驶员生成的ID 查询vehicle
集合:
Bson filter = Filters.eq("_id", new ObjectId()); FindIterable<Document> documents = collection.find(filter); MongoCursor<Document> cursor = documents.iterator(); while (cursor.hasNext()) { System.out.println(cursor.next()); }
上述查询不会返回任何文档,因为具有新生成ID 的文档不会存在于vehicle
集合中。
六,结论
在本文中,我们学习了在MongoDB 中使用Document ID 查询文档。首先,我们在MongoDB Shell 查询中研究了这些用例,然后我们讨论了相应的Java 驱动程序代码。
0 评论