Mongo - Bulk Найти и обновить весь документ, кроме одного поля - PullRequest
0 голосов
/ 06 декабря 2018

Я выполняю массовую операцию обновления / вставки для нескольких тысяч документов одновременно из CSV.Я обновляю весь документ с $set, и это в настоящее время работает нормально.

Если документ существует, я хочу сохранить одно поле, доступное только из БД, и у меня нет доступа к нему.Поэтому мне нужно извлечь это поле в .find(), применить его к документу в памяти, а затем обновить документ с помощью $set в update() Я не могу применить логику между bulk.find() и.update()

Вот пример кода:

// This is currently the code I'm implementing, works fine
users.forEach((user) => {
  bulk.find({ username: user.username})
  .updateOne({ $set: { user } });
});
bulk.execute();

Я бы хотел сделать что-то вроде этого:

// code won't work, this is what I'm attempting to do
users.forEach((user) => {
  bulk.find({ username: user.username}, function (dbUser) {
    if (dbUser) user.email = dbUser.email;
  })
  .updateOne({ $set: { user } });
});

Но bulk.find ().update () не позволяет промежуточную логику, насколько я могу придумать.У кого-нибудь есть работа или документы, которые я не могу найти?

1 Ответ

0 голосов
/ 02 апреля 2019

разобрался с решением.Объедините find / updateOne с upsert() и $setOnInsert.Итак, что здесь происходит, мы ищем пользователя в базе данных, если он существует, мы просто обновляем несколько полей с $set.Если пользователь не находится в базе данных, мы вставляем его с полями из $set, а также остальной пользовательский объект через $setOnInsert.Если пользователь уже существует в БД, к ним применяется $set, но они пропускают метод $setOnInsert.

Ключи между этими двумя методами должны быть взаимоисключающими, чтобы это работало.

 users.forEach((user) => {
        bulk
            .find(pick(user, 'email', 'username'))
            .upsert()
            .updateOne({
                $set: pick(user, keysToExcludeOnUpsert),
                $setOnInsert: omit(user, keysToExcludeOnUpsert)
            });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...