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