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


    1. 概述

    在本教程中,我们将介绍如何在MongoDB中将文档插入到数组中。此外,我们将看到 $push$addToset 运算符用于将值添加到数组中的各种应用。

    首先,我们将创建一个示例数据库、一个集合,并将虚拟数据插入其中。此外,我们将研究一些使用 $push 运算符更新文档的基本示例。稍后,我们还将讨论 $push$addtoSet 运算符的各种用例。

    让我们深入研究在 MongoDB 中将文档插入数组的各种方法。

    2. 数据库初始化

    首先,让我们建立一个新的数据库baeldung和一个样本集合,orders

    use baeldung;
    db.createCollection(orders);
    
    • 1
    • 2

    现在让我们使用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
                } 
              ]
        }
    ]);
    
    • 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

    如果插入成功,上面的命令将打印一个类似于下面的 JSON:

    {
        "acknowledged" : true,
        "insertedIds" : [
            ObjectId("622300cc85e943405d04b567"),
    	ObjectId("622300cc85e943405d04b568")
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    至此,我们已经成功建立了数据库和集合。我们将在所有示例中使用这个数据库和集合。

    3. 使用 Mongo Query 进行推送操作

    MongoDB 提供了各种类型的数组运算符来更新 MongoDB 文档中的数组。 MongoDB 中的 $push 运算符将值附加到数组的末尾。根据查询的类型,我们可以将$push运算符与updateOneupdateManyfindAndModify 等方法一起使用。

    现在让我们看看使用*$push*运算符的 shell 查询:

    db.orders.updateOne(
        {
            "customerId": 1023
        },
        {
            $push: {
                "items":{
                    "itemName": "PIZZA MANIA",
                    "quantity": 1,
                    "price": 800
                }
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    上述查询将返回以下文档:

    {
        "acknowledged":true,
        "matchedCount":1,
        "modifiedCount":1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    现在让我们查看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
            }
        ]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    4. 使用Java驱动代码进行推送操作

    到目前为止,我们已经讨论了将文档推送到数组中的 MongoDB shell 查询。现在让我们使用 Java 代码实现推送更新查询。

    在执行更新操作之前,我们先连接到 baeldung数据库中的orders集合:

    mongoClient = new MongoClient("localhost", 27017);
    MongoDatabase database = mongoClient.getDatabase("baeldung");
    MongoCollection<Document> collection = database.getCollection("orders");
    
    • 1
    • 2
    • 3

    在这里,在这种情况下,我们连接到在 localhost 的默认端口 27017 上运行的 MongoDB。

    4.1. 使用 DBObject

    MongoDB Java 驱动程序提供对DBObjectBSON文档的支持。在这里,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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在上面的查询中,我们首先使用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));
    
    • 1
    • 2
    • 3
    • 4

    在这种情况下,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
                }
            }
        });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这种情况下,输出将如下所示:

    {
        "acknowledged":true,
        "matchedCount":1,
        "modifiedCount":1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这种情况下,我们使用了 $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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在上面的代码中,首先我们创建了文档“item”,在customerId过滤器的基础上,updateOne方法会尝试将文档“item”推送到数组“items”中。

    6. 结论

    在本文中,我们学习了使用 $push$addToSet 运算符将新值推送到数组中。首先,我们研究了 $push 运算符在 MongoDB shell 查询中的使用,然后我们讨论了相应的 Java 驱动程序代码。

  • 相关阅读:
    [SDR] GNU Radio 系列教程(十五)—— GNU Radio GFSK 模块
    2.Rust变量
    【备战蓝桥杯系列】Java组国二选手笔记一:蓝桥杯中的常用语法特性
    Java泛型进阶学习
    显而易看app的订阅内容
    网络编程简单学习
    LeetCode刷题---141. 环形链表(双指针-滑动窗口)
    基于LLMs的多模态大模型(MiniGPT-4,LLaVA,mPLUG-Owl,InstuctBLIP,X-LLM)
    dubbo快速入门
    KubeEdge 1.12版本发布,稳定性、安全性、可扩展性均带来大幅提升
  • 原文地址:https://blog.csdn.net/wjw465150/article/details/127800629