我将这种结构放入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但它似乎不适用于嵌套数组中的嵌入式文档(只有简单的值数组)。
你能给我一些建议吗?
谢谢!
答案 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
}
]
}
]
}
这就是你想要的吗?