我在我的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
对象类型。
答案 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);
});
}
});