2015-05-09 3 views
2

У меня есть массив объектов, которые я хотел бы вставить в коллекцию MongoDB, однако я бы хотел проверить, есть ли каждый элемент уже в коллекции. Если он не существует, вставьте его, если он существует, а затем не вставляйте его.Умножить массив элементов с помощью MongoDB

После некоторого Googling мне кажется, что лучше всего использовать метод обновления с свойством upsert, установленным в true.

Это похоже на работу, если я передам ему один элемент, а также, если я перебираю массив и вставляю элементы по одному, однако я не уверен, правильно ли это делается , или если это наиболее эффективно. Вот что я делаю в данный момент:

var data = [{}, {}, ... {}]; 

for (var i = 0; i < data.length; i++) { 

    var item = data[i]; 

    collection.update(
    {userId: item.id}, 
    {$setOnInsert: item}, 
    {upsert: true}, 
    function(err, result) { 

     if (err) { 
     // Handle errors here 
     } 

    }); 

} 

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

ответ

2

Я вижу два варианта здесь, в зависимости ваших точных потребностей:

  • Если вам нужно вставки или обновления использовать upsert query. В этом случае, если объект уже присутствует, вы его обновите - если у вашего документа будет некоторый контент, это означает, что вы, возможно, перезапишете предыдущее значение некоторых полей. Как вы заметили, использование $setOnInsert смягчит эту проблему.
  • Если вам нужно Вставьте или проигнорируйте, добавьте unique index в соответствующие поля и дайте вставке сбой по дубликатному ключу. Поскольку у вас есть несколько документов для вставки, вы можете отправить их все в массив, используя unordered insert (например, установив ordered вариант false), поэтому MongoDB продолжит вставлять оставшиеся документы в случае ошибки с одним из них.

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

+1

Отлично, это именно то, что мне нужно. Я начал, пытаясь вставить весь массив, который не удался и остановился, когда он столкнулся с дубликатом, поэтому я подумал, что мне, возможно, придется это сделать так, как я изложил в вопросе. Я не знал, что вы можете использовать неупорядоченную вставку для продолжения вставки, даже если некоторые из вставок терпят неудачу. Благодаря! – joshfarrant

Смежные вопросы