как обновить данные во вложенном объекте - PullRequest
0 голосов
/ 30 января 2020

Я хочу обновить данные во вложенном объекте, используя mon goose. Моя модель такая:

{
  _id: 123,
  shoppingCart: [{
    _id: 321,
    totalPrice: 110,
    itemCount: 1,
    items: [{
      title: "product123",
      quantity: 2
    }]
  }]
}

Я хочу обновить количество товаров в ShoppingCart. Я прочитал документы, но не смог понять, как я могу обновить количество?

Ответы [ 2 ]

0 голосов
/ 30 января 2020

В случае, если ваши данные не заполнены (общий доступ к do c сохраняется в одной коллекции):

Насколько я помню, прямого пути нет сделай это. Сначала вы должны получить do c, а затем обновить его, как хотите. Элементы вложены, поэтому у каждого из них также будет свой идентификатор:

const doc = await Model.findById(docId); // or find or findOne
const item = doc.shoppingCart.items.id(itemId);
item.quantity = 10;
await doc.save();

Если вы хотите удалить вложенный документ по заголовку, но не имеете itemId, вам придется искать элементы и находить id этого предмета, получите подпункт do c, как и раньше, do item.remove(), а затем doc.save():

const items = doc.shoppingCart[0].items;
const idx = items.findIndex((item) => item.title === 'product123');
const item = items.id(items[idx]._id);
item.remove();
doc.save();

Лучше поделиться тем, что вы уже сделали. Затем также поделитесь моделью, корзина покупок отображается в виде массива, что, я думаю, не имеет смысла.

Кстати, у mon goose есть отличная документация, которая является вашим хорошим другом: Субдокумент документация

0 голосов
/ 30 января 2020

Вы хотите использовать arrayFilters примерно так:

db.collection.updateOne(
    {  
        //query to match document
    },
    { $inc: { "shoppingCart.items.$[element].quantity": 1 } }, //increase by one.
    { arrayFilters: [ { "element.title": "product123" } ] }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...