拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 在MongoDB 中使用Document ID 查询文档

在MongoDB 中使用Document ID 查询文档

白鹭 - 2022-07-20 2267 0 2

一、概述

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

发表评论

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