Как обновить встроенный документ во вложенный массив?

У меня есть такая структура в коллекции 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, но, похоже, он не работает для встроенного документа во вложенных массивах (только массивы простых значений).

Вы можете дать мне совет по этому поводу?

Спасибо !

какая у вас версия сервера mongo? запустите db.version (), чтобы узнать версию. вы можете показать запрос с фильтрами массива?

s7vr 10.04.2018 15:14

@Junayy, arrayFilters не будет работать должным образом, если вы не выполняете запрос из последней оболочки mongo. Также утверждение I tried arrayFilters but it doesn't seem to work for embedded document in nested arrays не соответствует действительности.

Rahul Raj 10.04.2018 15:16

@Veeram Я на монго 3.6

Junayy 10.04.2018 15:17

Вы выполняете в оболочке mongo или стороннем инструменте?

Rahul Raj 10.04.2018 15:18

@Rahul Raj монго оболочка

Junayy 10.04.2018 15:18

@Junayy проверьте запрос ниже, он работает с моей оболочкой mongo.

Rahul Raj 10.04.2018 15:33

@Junayy Я отредактировал свой ответ со всеми необходимыми изменениями.

Rahul Raj 10.04.2018 15:54
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
7
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 (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
            }
        ]
    }
 ]
}

Вы этого хотели?

Другие вопросы по теме