Пн goose увеличить значение массива поддокументов в другом массиве поддокументов - PullRequest
1 голос
/ 30 мая 2020

У меня есть такой документ

_id:'111'
products:[
   {
    _id:'pqr'
    nums:[
      {_id:'aaa',
      quantity:50
      },
      {_id:'bbb',
       quantity:50
      }
    ]
   }
]

Для облегчения понимания приведенный выше документ можно резюмировать следующим образом.

   _id
   products: [
      nums: [
        {}, //quantity is in this object
        {}
      ]
   ]

Мне нужно увеличить значение количество в поддокументе nums , которое находится в поддокументе продуктов на основе его _id.

Это то, что я пробовал до сих пор, но это не работает, так как я не знаю, как поймать _id внутри nums объект, чтобы обновить указанный объект c в этом массиве вложенных поддокументов.

Shop.findOneAndUpdate(
       { "_id": '111', "products._id": 'pqr'  },
          {
            "$inc": {
               "products.$[].nums.quantity": 1
            }
    }
)

Как я могу этого добиться?

1 Ответ

1 голос
/ 30 мая 2020

Использование фильтров массивов в операции обновления:

db.getCollection("collectionName").findOneAndUpdate(
  { _id: "111" }, // Querying against `_id`, need to convert string to `ObjectId()` or instead use `.findByIdAndUpdate()`
  { $inc: { "products.$[p].nums.$[n].quantity": 1 } },
  {
    arrayFilters: [{ "p._id": "pqr" }, { "n._id": "aaa" }] // Inputs here
  }
  // Use { new : true } Option in mongoose to return updated document
);

Ввод do c:

{
    "_id" : "111",
    "products" : [ 
        {
            "_id" : "pqr",
            "nums" : [ 
                {
                    "_id" : "aaa",
                    "quantity" : 50
                }, 
                {
                    "_id" : "bbb",
                    "quantity" : 50
                }
            ]
        }, 
        {
            "_id" : "abc",
            "nums" : [ 
                {
                    "_id" : "aaa1",
                    "quantity" : 501
                }, 
                {
                    "_id" : "bbb1",
                    "quantity" : 501
                }
            ]
        }
    ]
}

Вывод do c:

{
    "_id" : "111",
    "products" : [ 
        {
            "_id" : "pqr",
            "nums" : [ 
                {
                    "_id" : "aaa",
                    "quantity" : 51 // This got incremented
                }, 
                {
                    "_id" : "bbb",
                    "quantity" : 50
                }
            ]
        }, 
        {
            "_id" : "abc",
            "nums" : [ 
                {
                    "_id" : "aaa1",
                    "quantity" : 501
                }, 
                {
                    "_id" : "bbb1",
                    "quantity" : 501
                }
            ]
        }
    ]
}

Ссылка: mon goose .findByIdAndUpdate ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...