Push или addToSet для нескольких элементов во вложенном документе в Mongoose

Можно ли использовать Push или addToSet для нескольких элементов, например, этот код добавляет одно примечание, если оно еще не существует, в массив поддокументов для пользователя. Но что, если у меня есть 200 заметок?

const note = { id: 1 };
User.update(
    {name: 'admin', 'notes.id': {$ne: note.id}}, 
    {$push: {notes: note}},
    function(err, numAffected) { ... });

Можно ли использовать цикл foreach и запустить этот код 200 раз?

Это нормально, но медленно. Тем не менее, я не знаю "способа MongoDB" сделать это лучше. Я бы порекомендовал просто прочитать документ, изменить его на клиенте и затем отправить все это в базу данных за одно обновление.

dnickless 26.10.2018 23:29

Но тогда я упускаю из виду весь смысл проверки Mongoose, верно?

Miguel Stevens 26.10.2018 23:30

Какая именно проверка? Обновление снова пройдет через Mongoose, так что разницы быть не должно?

dnickless 26.10.2018 23:39

Итак, вы бы тогда проверили, является ли note.id уникальным на стороне клиента? Поскольку у Mongoose есть этот уникальный валидатор, который я могу добавить в свою схему NoteSchema ..

Miguel Stevens 26.10.2018 23:40

Вы про это: npmjs.com/package/mongoose-unique-array? Насколько я понимаю - я не являюсь пользователем Mongoose - это произойдет при сохранении / обновлении, поэтому оно должно работать. Просто попробуйте!

dnickless 26.10.2018 23:44

@dnickless, чтобы добавить к вашей рекомендации, чтение, изменение и отправка должны происходить в рамках сеанса транзакции, поскольку в противном случае теряется атомарная функция обновления

Alon Arad 23.06.2020 12:32
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
2
6
355
0

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