Как выполнить массовое обновление массива объектов Mon go DB с json, совпадающим по id - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно обновить поле MongoDB массивом объектов с идентификатором, который необходимо обновить с тем же идентификатором в JSON объекте

, если у меня есть что-то подобное в MongoDB

{
    _id: "adqeer32423twefds",
    books : [
        {
          id : 111,
          name: "ABC"
        },
        {
          id : 123,
          name: "ABCD"
        }
    ]
}

И у меня есть такие данные JSON, которые должны быть вставлены в Mon go

{
    _id: "adqeer32423twefds",
    books : [
        {
          id : 111,
          author: "ccc"
        },
        {
          id : 123,
          author: "dddd"
        }
    ]
}

После обновления мне нужны окончательные данные, подобные этим, в Mon go collection

{
    _id: "adqeer32423twefds",
    books : [
        {
          id : 111,
          name: "ABC",
          author: "ccc"
        },
        {
          id : 123,
          name: "ABCD",
          author: "dddd"
        }
    ]
}

1 Ответ

1 голос
/ 26 марта 2020

Вы можете использовать позиционное обновление , чтобы сделать это одно за другим, и пакетировать эти обновления, используя bulkWrite.

const data = [
  { _id: 'id1', books: [{ id: 'id1_1', author: 'author1_1' }, /* ... */] },
  /* ... */
];

const bulk = [];
for (const { _id, books } of data) {
  for (const { id, author } of books) {
    bulk.push({
      updateOne: {
        filter: { _id, 'books.id': id },
        update: { $set: { 'books.$.author': author } }
      }
    });
  }
}

// Check if bulk is not empty - it will throw otherwise.
if (bulk.length > 0) db.collection.bulkWrite(bulk);
...