一、概述
在本教程中,我们将研究在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 评论