MongoDB中的push操作详解(将文档插入到数组)
爱游泳的老白 人气:01. 概述
在本教程中,我们将介绍如何在MongoDB中将文档插入到数组中。此外,我们将看到 $push
和 $addToset
运算符用于将值添加到数组中的各种应用。
首先,我们将创建一个示例数据库、一个集合,并将虚拟数据插入其中。此外,我们将研究一些使用 $push
运算符更新文档的基本示例。稍后,我们还将讨论 $push
和 $addtoSet
运算符的各种用例。
让我们深入研究在 MongoDB 中将文档插入数组的各种方法。
2. 数据库初始化
首先,让我们建立一个新的数据库baeldung和一个样本集合,orders:
use baeldung; db.createCollection(orders);
现在让我们使用insertMany方法将一些文档添加到集合中:
db.orders.insertMany([ { "customerId": 1023, "orderTimestamp": NumberLong("1646460073000"), "shippingDestination": "336, Street No.1 Pawai Mumbai", "purchaseOrder": 1000, "contactNumber":"9898987676", "items": [ { "itemName": "BERGER", "quantity": 1, "price": 500 }, { "itemName": "VEG PIZZA", "quantity": 1, "price": 800 } ] }, { "customerId": 1027, "orderTimestamp": NumberLong("1646460087000"), "shippingDestination": "445, Street No.2 Pawai Mumbai", "purchaseOrder": 2000, "contactNumber":"9898987676", "items": [ { "itemName": "BERGER", "quantity": 1, "price": 500 }, { "itemName": "NON-VEG PIZZA", "quantity": 1, "price": 1200 } ] } ]);
如果插入成功,上面的命令将打印一个类似于下面的 JSON:
{ "acknowledged" : true, "insertedIds" : [ ObjectId("622300cc85e943405d04b567"), ObjectId("622300cc85e943405d04b568") ] }
至此,我们已经成功建立了数据库和集合。我们将在所有示例中使用这个数据库和集合。
3. 使用 Mongo Query 进行推送操作
MongoDB 提供了各种类型的数组运算符来更新 MongoDB 文档中的数组。 MongoDB 中的 $push
运算符将值附加到数组的末尾。根据查询的类型,我们可以将$push
运算符与updateOne、updateMany、findAndModify 等方法一起使用。
现在让我们看看使用*$push*运算符的 shell 查询:
db.orders.updateOne( { "customerId": 1023 }, { $push: { "items":{ "itemName": "PIZZA MANIA", "quantity": 1, "price": 800 } } });
上述查询将返回以下文档:
{ "acknowledged":true, "matchedCount":1, "modifiedCount":1 }
现在让我们查看customerId 为 1023的文档。在这里,我们可以看到新项目插入到列表“ items ”的末尾:
{ "customerId" : 1023, "orderTimestamp" : NumberLong("1646460073000"), "shippingDestination" : "336, Street No.1 Pawai Mumbai", "purchaseOrder" : 1000, "contactNumber" : "9898987676", "items" : [ { "itemName" : "BERGER", "quantity" : 1, "price" : 500 }, { "itemName" : "VEG PIZZA", "quantity" : 1, "price" : 800 }, { "itemName" : "PIZZA MANIA", "quantity" : 1, "price" : 800 } ] }
4. 使用Java驱动代码进行推送操作
到目前为止,我们已经讨论了将文档推送到数组中的 MongoDB shell 查询。现在让我们使用 Java 代码实现推送更新查询。
在执行更新操作之前,我们先连接到 baeldung数据库中的orders集合:
mongoClient = new MongoClient("localhost", 27017); MongoDatabase database = mongoClient.getDatabase("baeldung"); MongoCollection<Document> collection = database.getCollection("orders");
在这里,在这种情况下,我们连接到在 localhost 的默认端口 27017 上运行的 MongoDB。
4.1. 使用 DBObject
MongoDB Java 驱动程序提供对DBObject和BSON文档的支持。在这里,DBObject是 MongoDB 旧版驱动程序的一部分,但在较新版本的 MongoDB 中已弃用。
现在让我们看看 Java 驱动程序代码以将新值插入到数组中:
DBObject listItem = new BasicDBObject("items", new BasicDBObject("itemName", "PIZZA MANIA") .append("quantity", 1) .append("price", 800)); BasicDBObject searchFilter = new BasicDBObject("customerId", 1023); BasicDBObject updateQuery = new BasicDBObject(); updateQuery.append("$push", listItem); UpdateResult updateResult = collection.updateOne(searchFilter, updateQuery);
在上面的查询中,我们首先使用BasicDBObject创建了项目文档。在searchQuery 的基础上,对集合的文档进行过滤,并将值推送到数组中。
4.2. 使用 BSON 文档
BSON文档是访问 Java 中的 MongoDB 文档的新方法,它是使用较新的客户端堆栈构建的。org.bson.Document
类不太复杂且更易于使用。
让我们使用org.bson.Document 类将值推送到数组“ items”中:
Document item = new Document() .append("itemName1", "PIZZA MANIA") .append("quantity", 1).append("price", 800); UpdateResult updateResult = collection.updateOne(Filters.eq("customerId", 1023), Updates.push("items", item));
在这种情况下,BSON的实现类似于使用DBObject 运行的代码,更新也将是相同的。在这里,我们使用updateOne方法仅更新单个文档。
5. 使用 addToSet操作符
$addToSet运算符也可用于将值压入数组。仅当数组中不存在该值时,此运算符才添加值。否则,它只会忽略它。而推送运算符将推送值作为过滤条件以获取匹配。
需要注意的一个关键点是 $addToSet
运算符在重复项目的情况下不会推送值工作。另一方面,$push
运算符只是将值推送到数组中,而不考虑任何其他条件。
5.1. 使用addToSet运算符的 Shell 查询
$addToSet
运算符的 mongo shell 查询类似于 $push
运算符,但 $addToSet
不会在数组中插入重复值。
现在让我们检查一下 MongoDB 查询,以使用&$addToset*将值推送到数组中:
db.orders.updateOne( { "customerId": 1023 }, { $addToSet: { "items":{ "itemName": "PASTA", "quantity": 1, "price": 1000 } } });
在这种情况下,输出将如下所示:
{ "acknowledged":true, "matchedCount":1, "modifiedCount":1 }
在这种情况下,我们使用了 $addToSet
运算符,只有当文档是唯一的时,才会将其推送到数组“items”中。
5.2. 使用addToSet运算符的 Java 驱动程序
$addToSet操作符提供了一种与推送操作符不同类型的数组更新操作:
Document item = new Document() .append("itemName1", "PIZZA MANIA") .append("quantity", 1).append("price", 800); UpdateResult updateResult = collection .updateOne(Filters.eq("customerId", 1023), Updates.addToSet("items", item)); System.out.println("updateResult:- " + updateResult);
在上面的代码中,首先我们创建了文档“item”,在customerId过滤器的基础上,updateOne方法会尝试将文档“item”推送到数组“items”中。
6. 结论
在本文中,我们学习了使用 $push
和 $addToSet
运算符将新值推送到数组中。首先,我们研究了 $push
运算符在 MongoDB shell 查询中的使用,然后我们讨论了相应的 Java 驱动程序代码。
总结
加载全部内容