获取Bulk.Insert()-Mongoskin的插入ID

时间:2016-06-27 07:22:06

标签: mongodb bulkinsert mongoskin

我在我的nodeJs应用程序中使用mongoskin在mongo db中插入数据。我需要在数据库中插入文档数组并将插入的记录的ID发送回客户端。我能够插入数据,但无法在结果对象中找到插入记录的ID。需要帮助在结果中找到insertedIds。我使用以下代码批量插入。

db.collection('myCollection', function (err, collection) {
    var bulk = collection.initializeUnorderedBulkOp();
    for (var i = 0; i < dataArray.length; i++) {
        bulk.insert(dataArray[i]);
    }

    bulk.execute(function (err, result) {
      //TODO: return the Ids of inserted records to the client
      //Client will use these Ids to perform subsequent calls to the nodejs service
    });
});

我的结果是BatchWriteResult对象类型。

1 个答案:

答案 0 :(得分:1)

建议使用其他批量API方法 upsert() ,这样您就可以使用{strong> BatchWriteResult() 对象_id通过调用 getUpsertedIds() 方法插入文档的值。结果对象的格式与 BulkWriteResult 的文档中给出的格式相同。

Bulk.find.upsert() 条件没有匹配的文档时,使用 Bulk.find() 选项的更新操作将执行插入操作。如果更新文档未指定_id字段,MongoDB会添加_id字段,因此您可以检索插入文档的ID 在您的 BatchWriteResult()

此外,通常不推荐排队批量插入操作的方式,因为这基本上是在内存中建立的;除了依赖于驱动程序default way of limiting the batches of 1000 at a time之外,您还希望通过管理队列和内存资源获得更多控制权,以及完整批量小于16MB。这样做的方法是使用数据数组的 forEach() 循环和一个计数器,这将有助于将批次限制为1000次。

以下显示了上述方法

function getInsertedIds(result){
    var ids = result.getUpsertedIds();
    console.log(ids); // an array of upserted ids
    return ids;
}

db.collection('myCollection',function(err,collection) {
    var bulk = collection.initializeUnorderedBulkOp(),
        insertedIds = [],
        counter = 0;

    dataArray.forEach(function (data){
        bulk.find(data).upsert().updateOne(data);
        counter++;

        if (counter % 1000 == 0) {
            bulk.execute(function(err, result) {
               insertedIds = getInsertedIds(result);
               bulk = collection.initializeUnorderedBulkOp(); // reset after execute
            });      
        }
    });

    // Clean up the remaining operations in the queue which were 
    // cut off in the loop - counter not a round divisor of 1000
    if (counter % 1000 != 0 ) {
        bulk.execute(function(err, result) {
            insertedIds = insertedIds.concat(getInsertedIds(result));
            console.log(insertedIds);
        });
    }
});