Проблема при вставке нескольких документов (Bulk Insert) в коллекцию mongoDB с помощью monk в Node.JS?

Я пытаюсь вставить несколько документов в коллекцию в базе данных mongoDB, но в качестве ответа я получаю только один идентификатор объекта (в БД создается несколько документов).

Код:

exports.createRelation = function(relationDoc, db, callback) {
var relations = db.get("relations");
relations
        .insert( relationDoc )
    .error( function ( err ) {
        callback(err, null);
    })
    .success( function ( doc ){
        callback(null, doc);
   });
};

в этом отношении Doc будет массив

Входные данные:

newRelDocs_Array:  [ { 
    path: [ 53d0b191c5ac61d403b0090d ] 
    tob: 1405343247 },
  { 
    path: [ 53d0b191c5ac61d403b0090d ],
    tob: 1405343247 } ]

Отклик:

createRelation(): Success
createRelation_db:  { 
  _id: 546a1d6f65c05d1c37660c4c,
  tob: 1405343247

}

К вашему сведению, я использую NodeJS и соединение с MongoDB с монахом.

2 ответа

Оболочка коллекции Monk обеспечивает доступ к базовому объекту коллекции через .col поле. Вы можете использовать его для доступа к методам, не реализованным Monk, таким как массовая вставка и агрегат:

var relations = db.get("relations");
var docs = [ { 
              path: [ "53d0b191c5ac61d403b0090d" ],
              tob: 1405343247
             }, {
              path: [ "53d0b191c5ac61d403b0090d" ],
              tob: 1405343247
             } ];
relations.col.insert(docs, callback);

Обратите внимание, что с .col однако вы не сможете использовать функцию обещаний, предоставляемую монахом. Смотрите здесь для получения дополнительной информации.

В своем вопросе вы говорите, что realationDoc - это массив, который, как я полагаю, выглядит примерно так:

realationDoc = [{
  id: 1,
  relation: 2
 },{
  id: 2, relation: 1
 }];

В Monk функция вставки не поддерживает встроенную функцию MonogoDB 2.4 Bulk Insert. См. http://docs.mongodb.org/manual/reference/method/Bulk.insert/

С вашим кодом, таким, какой он есть, вы создаете коллекцию из одного документа, который имеет 2 поля: 1 - автоматически сгенерированный _id и второе поле - ваш массив.

Чтобы сделать то, что вы хотите, вам нужно изменить ваш код следующим образом:

for(var i = 0; i<relationDoc.length;i++){
  relations.insert(relationDoc[i])
  //..add promise code for success and error stuff
}

Вероятно, не так эффективно, как Bulk Insert, предоставляемая в родном драйвере, но она должна привести вас туда, куда вам нужно пойти с монахом.

Другие вопросы по тегам