如何将嵌入式文档更新为嵌套数组?

时间:2018-04-10 13:08:54

标签: arrays mongodb mongodb-query

我将这种结构放入Mongo集合中:

{
  "_id": "12345678",
  "Invoices": [
    {
      "_id": "123456789",
      "Currency": "EUR",
      "DueTotalAmountInvoice": 768.3699999999999,
      "InvoiceDate": "2016-01-01 00:00:00.000",
      "Items": [
        {
          "Item": 10,
          "ProductCode": "ABC567",
          "Quantity": 1
        },
        {
          "Item": 20,
          "ProductCode": "CDE987",
          "Quantity": 1
        }
      ]
    },
    {
      "_id": "87654321",
      "Currency": "EUR",
      "DueTotalAmountInvoice": 768.3699999999999,
      "InvoiceDate": "2016-01-01 00:00:00.000",
      "Items": [
        {
          "Item": 30,
          "ProductCode": "PLO987",
          "Quantity": 1,
          "Units": "KM3"
        },
        {
          "Item": 40,
          "ProductCode": "PLS567",
          "Quantity": 1,
          "DueTotalAmountInvoice": 768.3699999999999
        }
      ]
    }
  ]
}

所以我有一个存储多个发票的第一个对象,每个发票存储多个项目。项目是嵌入式文档。 所以在关系模型化中: 客户有1个或多个发票 发票有1个或多个项目

我正面临一个问题,因为我正在尝试将特定项目更新为特定的特定发票。例如,我想在发票123456789中更改项目10的数量。

在Mongodb中如何做到这一点?

我试过了:

  • 推送语句,但它似乎不适用于嵌套数组

  • arrayFilters但它似乎不适用于嵌套数组中的嵌入式文档(只有简单的值数组)。

你能给我一些建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

根据您的问题描述:

For example I want to change the quantity of the item 10 in Invoice 123456789.我刚刚将Quantity更改为3.您可以根据需要在此处执行任何操作。您只需要注意我在这里使用arrayFilters的方式。

尝试此查询:

db.collection.update(
 {"_id" : "12345678"},
 {$set:{"Invoices.$[element1].Items.$[element2].Quantity":3}},
 {multi:true, arrayFilters:[ {"element1._id": "123456789"},{ 
  "element2.Item": { $eq: 10 }} ]}
)

上述查询已成功从mongo shell(Mongo 3.6.3)执行。我看到了这个结果:

/* 1 */
{
"_id" : "12345678",
"Invoices" : [ 
    {
        "_id" : "123456789",
        "Currency" : "EUR",
        "DueTotalAmountInvoice" : 768.37,
        "InvoiceDate" : "2016-01-01 00:00:00.000",
        "Items" : [ 
            {
                "Item" : 10,
                "ProductCode" : "ABC567",
                "Quantity" : 3.0
            }, 
            {
                "Item" : 20,
                "ProductCode" : "CDE987",
                "Quantity" : 1
            }
        ]
    }, 
    {
        "_id" : "87654321",
        "Currency" : "EUR",
        "DueTotalAmountInvoice" : 768.37,
        "InvoiceDate" : "2016-01-01 00:00:00.000",
        "Items" : [ 
            {
                "Item" : 30,
                "ProductCode" : "PLO987",
                "Quantity" : 1,
                "Units" : "KM3"
            }, 
            {
                "Item" : 40,
                "ProductCode" : "PLS567",
                "Quantity" : 1,
                "DueTotalAmountInvoice" : 768.37
            }
        ]
    }
 ]
}

enter image description here

这就是你想要的吗?