Добавление поля массива из другого поля в документы MongoDB (с MongoClient) в Node.js - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть коллекция под названием Users.

Вот пример do c.

{"_id":{"$oid":"xxxxxxxxxxxxxxxxxxx"},
"userId":"ANKIT",
"token":"token123",
"badge":{"$numberInt":"0"},
"useLocalCurrency":true,
"notifyCustomerRejected":true,
"notifyReworkRequest":true,
"notifyMoaApproved":true,
"notifyCustomerAccepted":true,
"__v":{"$numberInt":"0"},
"tokens":[]}

Я пытаюсь поместить sh token в массив tokens для всех документов в Миграция БД.

Вот что я пробовал:

export function up(next) {
    let mClient = null;
    return MongoClient.connect(url)
        .then(client => {
            mClient = client;
            return client.db('notifications');
        })
        .then(db => {
            const User = db.collection('users');
            return User.find().forEach(result => {
                let { _id, userId, tokens, token } = result;
                tokens.push(token);
                tokens = Array.from(new Set(tokens));
                result.tokens = tokens;
                console.log(result._id);
                console.log(result.tokens);
                User.update({ _id: _id, userId: userId }, { $set: { tokens: tokens } });
            });
        })
        .then(() => {
            mClient.close();
            return next();
        })
        .catch(err => next(err));
}

При этом я обновляю 1-й документ только так, как хочу, а не остальные. Что я здесь не так делаю?

Спасибо

1 Ответ

0 голосов
/ 18 апреля 2020

Вызов update изменяет только первый соответствующий документ. Вам нужно будет использовать updateMany или передать параметр multi, чтобы повлиять на них всех.

Этот код, похоже, находит все документы в коллекции User с помощью collscan, а затем запускает отдельное обновление в forEach. l oop:

            return User.find().forEach(result => {
                let { _id, userId, tokens, token } = result;
                tokens.push(token);
                tokens = Array.from(new Set(tokens));
                result.tokens = tokens;
                console.log(result._id);
                console.log(result.tokens);
                User.update({ _id: _id, userId: userId }, { $set: { tokens: tokens } });
            });

Если вы хотите добавить токен в массив для каждого пользователя, попробуйте использовать:

            return User.updateMany({},{$push: {tokens: token}})
...