2014-12-28 5 views
0

Есть ли способ установить фиксированное ограничение количества документов, которое может быть вставлено посредством объемной вставки в mongodb с использованием клиента node.js?Предельное количество вложений mongodb

Я вставляю несколько документов в коллекцию, которая имеет уникальный индекс на fieldA через объемную вставку. Некоторые из вставок будут разрушаться из-за fieldA не являясь уникальным, так что я не могу знать, сколько будет вставлен заранее, но я хочу, чтобы ограничить nInserted так, чтобы сумма этих документов никогда не переходит 5000.

Все, что я могу сделать, это запустить полную вставку, и если nInserted приносит общее количество выше 5000, я удаляю последние вставленные n документы, так что общая сумма 5000, но это кажется немного глупым.

Упорядоченная объемная вставка почти права, но я не хочу, чтобы она остановилась на первом конфликте с индексом, но продолжайте движение, если еще есть место (то есть < 5000 всего).

Вот пример того, что я пытаюсь достичь:

db.myCol.count({foo: val}, function(err, count) { 
    var remaining = 5000 - count; 
    if (remaining > 0) { 
     var bulk = db.myCol.initializeUnorderedBulkOp(); 
     toInsert.forEach(function(item) { 
      bulk.insert(item); 
     }); 

     // make sure no more than remaining is inserted 
     bulk.execute(function(err, result) { 
      // currently, I would just insert all and 
      // then remove the overflow with another db action 
      // if nInserted + count > 5000 
     }); 
    } 
}); 
+0

Итак, вы хотите иметь 5000 записей в коллекции, как только операция массовой завершена? Можете ли вы опубликовать выполненную вами реализацию? – BatScream

+0

@BatScream Я хочу убедиться, что не более 5000 документов определенного типа> 5000 после запуска объемной вставки. Я обновил вопрос, чтобы привести пример. – apen55

ответ

0

В настоящее время не существует никакого способа сказать Bulk API, чтобы остановить вставить какую-либо запись, как только предел успешных вставок достигнута. Один из способов сделать это на стороне клиента,

  • Поток Bulk API в самых n (5000 в данном случае) документы на время
  • Если произошла какая-либо ошибка во время вставки, Магистральный вставить Осталось.
  • Рекурсивно.
  • Вы можете дополнительно добавить логику для обработки только оставшегося числа записей, если remaining < max.

Модифицированный код:

var toInsert = [..]; // documents to be inserted. 

var max = 5000; // max records for Bulk insert. 

function execBulk(start,end){ 
    db.myCol.count({foo: 'bar'}, function(err, count) { 
    var remaining = total - count; 
    if (remaining > 0 && toInsert.length > start) { 
     var bulk = db.myCol.initializeUnorderedBulkOp(); 
     toInsert.slice(start,end).forEach(function(item) { 
      bulk.insert(item); 
     }); 
     // insert the records 
     bulk.execute(function(err, result) { 
      if(err){ 
       console.log(err); 
       // insert next set of at most 5000 records. 
       execBulk(end,end+max-1) 
      } 
      else 
      { 
       console.log(results); 
      } 
     }); 
    } 
}); 
} 

Вызов функции:

execBulk(0,max); 
Смежные вопросы