MongoDB中的push操作详解(将文档插入到数组)

1. 概述

在本教程中,我们将介绍如何在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 驱动程序代码。

总结

作者:爱游泳的老白原文地址:https://blog.csdn.net/wjw465150/article/details/127800629

%s 个评论

要回复文章请先登录注册