У меня есть такая структура в коллекции 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 или несколько позиций
У меня возникла проблема, поскольку я пытаюсь обновить конкретный элемент до определенного конкретного счета-фактуры. Например, я хочу изменить количество товара 10 в счете-фактуре 123456789.
Как это можно сделать в Mongodb?
Я пытался :
Оператор push, но, похоже, он не работает для вложенных массивов
arrayFilters, но, похоже, он не работает для встроенного документа во вложенных массивах (только массивы простых значений).
Вы можете дать мне совет по этому поводу?
Спасибо !
@Junayy, arrayFilters не будет работать должным образом, если вы не выполняете запрос из последней оболочки mongo. Также утверждение I tried arrayFilters but it doesn't seem to work for embedded document in nested arrays не соответствует действительности.
@Veeram Я на монго 3.6
Вы выполняете в оболочке mongo или стороннем инструменте?
@Rahul Raj монго оболочка
@Junayy проверьте запрос ниже, он работает с моей оболочкой mongo.
@Junayy Я отредактировал свой ответ со всеми необходимыми изменениями.



Согласно описанию вашей проблемы здесь:
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 (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
}
]
}
]
}
Вы этого хотели?
какая у вас версия сервера mongo? запустите db.version (), чтобы узнать версию. вы можете показать запрос с фильтрами массива?