1. 概述
在本教程中,我们将介绍如何在MongoDB中将文档插入到数组中。此外,我们将看到 $push
和 $addToset
运算符用于将值添加到数组中的各种应用。
首先,我们将创建一个示例数据库、一个集合,并将虚拟数据插入其中。此外,我们将研究一些使用 $push
运算符更新文档的基本示例。稍后,我们还将讨论 $push
和 $addtoSet
运算符的各种用例。
让我们深入研究在 MongoDB 中将文档插入数组的各种方法。
2. 数据库初始化
首先,让我们建立一个新的数据库baeldung和一个样本集合,orders:
1 2 | use baeldung; db.createCollection(orders); |
现在让我们使用insertMany方法将一些文档添加到集合中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | 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:
1 2 3 4 5 6 7 | { "acknowledged" : true , "insertedIds" : [ ObjectId( "622300cc85e943405d04b567" ), ObjectId( "622300cc85e943405d04b568" ) ] } |
至此,我们已经成功建立了数据库和集合。我们将在所有示例中使用这个数据库和集合。
3. 使用 Mongo Query 进行推送操作
MongoDB 提供了各种类型的数组运算符来更新 MongoDB 文档中的数组。 MongoDB 中的 $push
运算符将值附加到数组的末尾。根据查询的类型,我们可以将$push
运算符与updateOne、updateMany、findAndModify 等方法一起使用。
现在让我们看看使用*$push*运算符的 shell 查询:
1 2 3 4 5 6 7 8 9 10 11 12 13 | db.orders.updateOne( { "customerId" : 1023 }, { $push: { "items" :{ "itemName" : "PIZZA MANIA" , "quantity" : 1, "price" : 800 } } }); |
上述查询将返回以下文档:
1 2 3 4 5 | { "acknowledged" : true , "matchedCount" :1, "modifiedCount" :1 } |
现在让我们查看customerId 为 1023的文档。在这里,我们可以看到新项目插入到列表“ items ”的末尾:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | { "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集合:
1 2 3 | mongoClient = new MongoClient( "localhost" , 27017 ); MongoDatabase database = mongoClient.getDatabase( "baeldung" ); MongoCollection collection = database.getCollection( "orders" ); |
在这里,在这种情况下,我们连接到在 localhost 的默认端口 27017 上运行的 MongoDB。
4.1. 使用 DBObject
MongoDB Java 驱动程序提供对DBObject和BSON文档的支持。在这里,DBObject是 MongoDB 旧版驱动程序的一部分,但在较新版本的 MongoDB 中已弃用。
现在让我们看看 Java 驱动程序代码以将新值插入到数组中:
1 2 3 4 5 6 7 | 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”中:
1 2 3 4 | 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*将值推送到数组中:
1 2 3 4 5 6 7 8 9 10 11 12 13 | db.orders.updateOne( { "customerId" : 1023 }, { $addToSet: { "items" :{ "itemName" : "PASTA" , "quantity" : 1, "price" : 1000 } } }); |
在这种情况下,输出将如下所示:
1 2 3 4 5 | { "acknowledged" : true , "matchedCount" :1, "modifiedCount" :1 } |
在这种情况下,我们使用了 $addToSet
运算符,只有当文档是唯一的时,才会将其推送到数组“items”中。
5.2. 使用addToSet运算符的 Java 驱动程序
$addToSet操作符提供了一种与推送操作符不同类型的数组更新操作:
1 2 3 4 5 6 | 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 驱动程序代码。
总结
到此这篇关于MongoDB中的push操作详解的文章就介绍到这了,更多相关MongoDB push操作内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!