Как обновить уже существующие данные с такими же идентификаторами электронной почты в insertMany в mongodb? - PullRequest
0 голосов
/ 08 мая 2020

Допустим, у меня есть некоторые документы, например -

[
     {
        fname: "FirstName1",
        lname: "LastName1",
        email: "a@gmail.com"
     },
     {
        fname: "FirstName2",
        lname: "LastName2",
        email: "b@gmail.com"
     },
     ...
]

, уже существующие в базе данных. Теперь я собираюсь вставить несколько документов с помощью insertMany в эту базу данных, где некоторые из объектов содержат одинаковые идентификаторы электронной почты, например -

[
     {
        fname: "FirstName3",
        lname: "LastName3",
        email: "c@gmail.com"
     },
     {
        fname: "FirstName4",
        lname: "LastName4",
        email: "a@gmail.com"
     },
     {
        fname: "FirstName5",
        lname: "LastName5",
        email: "b@gmail.com"
     },
     ...
]

Поэтому мне нужно заменить предыдущие документы другими полями, которые содержат одинаковые адреса электронной почты со вставленным. Итак, я хочу, чтобы база данных выглядела так.

[
     {
        fname: "FirstName4",
        lname: "LastName4",
        email: "a@gmail.com"
     },
     {
        fname: "FirstName5",
        lname: "LastName5",
        email: "b@gmail.com"
     },
     {
        fname: "FirstName3",
        lname: "LastName3",
        email: "c@gmail.com"
     },
     ...
]

Есть ли какое-нибудь решение. Пожалуйста, дайте мне знать. Спасибо.

1 Ответ

0 голосов
/ 08 мая 2020

Вы не можете сделать это с помощью insertMany , для этого вам нужно использовать массовое обновление с опцией upsert .

Ниже приведены два разных синтаксиса для этого. Для создания массовых запросов вам потребуется l oop. (Возможна опечатка, код не проверен)

var bulk = db.collection_name.initializeUnorderedBulkOp();
bulk.find( { email: "a@gmail.com" } ).upsert().update( { $set: { fname: "FirstName4", lname: "LastName4", email: "a@gmail.com" } } );
bulk.find( { email: "b@gmail.com" } ).upsert().update( { $set: { fname: "FirstName5", lname: "LastName5", email: "b@gmail.com" } } );
bulk.find( { email: "c@gmail.com" } ).upsert().update( { $set: { fname: "FirstName3", lname: "LastName3", email: "c@gmail.com" } } );
bulk.execute();

Другой синтаксис

var ops = []

objectsArray.forEach(item => {
    ops.push(
        {
            updateOne: {
                filter: { email: item .email},
                update: {
                    $set: { fname: item.fname, lname: item.lname, email: item.email }
                },
                upsert: true
            }
        }
    )
})

db.collections('collection_name').bulkWrite(ops, { ordered: false });

Если вы используете mon goose проверьте там Документация BulkWrite

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...