MongoDB insertMany и пропустить дубликаты - PullRequest
1 голос
/ 28 апреля 2020

Я пытаюсь insertMany() элементов в моей базе данных Mon go, но я хотел бы пропустить дублирующиеся идентификаторы.
Я использую Node.js и mongodb.

У меня есть некоторые данные:

const myExampleData = [
   {_id:'someId1', name:'I am example'},
   {_id:'someId2', name:'I am second example'}
];

, и я хотел бы вставить их так:

dbo.collection(collectionName).insertMany(myExampleData).catch(err=>{
    console.error(err);
});

Предположим, что someId1 уже существует. Я не хочу переопределять это. Я просто хочу пропустить это. В текущей ситуации он не вставляет someId2. Он останавливается, как только выдает исключение дубликатов.

Есть ли способ вставить и пропустить дубликаты?


Возможен дубликат вопроса.

Я нашел нить Вставка MongoDB без дубликатов , где предлагается использовать update() с upsert вместо insert(), что может быть хорошо для одного предмета. Но как насчет многих предметов? Насколько я знаю, updateMany() обновит все отфильтрованные строки одним и тем же значением, но я бы хотел вставить разные значения.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Проверка в вашем утверждении:

Предположим, что someId1 уже существует. Я не хочу переопределять это. Я просто хочу пропустить это.

Итак, вы просто хотели пропустить дублирующиеся документы, так как вы не хотите обновлять дублирующиеся документы с последними данными - так что нет необходимости использовать .update(), вы все еще можете сделать это, используя .insertMany () , передав флаг ordered в опциях запроса:

Заказано: Необязательно. Логическое значение, указывающее, должен ли экземпляр mongod выполнять упорядоченную или неупорядоченную вставку. По умолчанию true .

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
     ordered: <boolean>
   }
)

Ваш код:

dbo.collection(collectionName).insertMany(myExampleData, {ordered : false }).catch(err=>{
    console.error(err);
})

Как будто вы проверяете по _id, который будет иметь уникальный индекс по умолчанию и любые входящие дубликаты на самом деле вызовут ошибку. С ordered : false мы делаем эту операцию вставки неупорядоченной из-за того, что мы пропускаем все входящие дубликаты и продолжаем работу, фактически исключая любые ошибки.

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

Вы можете использовать bulkWrite для выполнения операции и получения аналогичного результата. Например, в mon go shell:

   db.collectionName.bulkWrite(
      [
         { updateOne :
            {
               "filter" : { _id:'someId1'},
               "update" : { $set : { name:'I am example'}},
               "upsert" : true
            }
         },
        { updateOne :
            {
               "filter" : { _id:'someId2' },
               "update" : { $set : { name:'I am second example'} },
              "upsert" : true
            }
         },
      ]
   );

При запуске вышеупомянутого будет вставлено только два документа при первом запуске. И не даст вам ошибок при последующих запусках.

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