我希望insert an array将数千个对象放入MongoDB集合中。
db.col.insert(
[
{ },
{ },
{ } // A couple of 1000s more
],
{
ordered : false,
writeConcern : 0
}
);
但是,我还想使用元数据来识别这些组。数组中的每条记录都需要分配一些数据,并且这些数据对于数组中的所有记录都是相同的。
有没有办法可以插入所有文件,而且所有文件也可以设置例如:
{
dateTime : '111111111',
groupId : 'some hash',
batchId : 'other hash'
}
没有手动将其手动添加到阵列中的数千条记录中?这将是一个很大的性能下降(而且只是丑陋)。
我曾经将这些记录添加为一个包含元数据的数组:
{
dateTime : '111111111',
groupId : 'some hash',
batchId : 'other hash',
batchArr : [ array with thousands of records]
}
并在其上使用$unwind
。但是,这已不再可能,因为记录数量已开始超过MongoDB 16 MB BSON size limit。
答案 0 :(得分:1)
对于 Bulk API 操作来说,这是一个非常好的候选者。有两种类型的批量操作:
考虑初始化 Bulk()
操作构建器并添加一系列插入操作以批量添加多个文档,从而简化您的性能:
var bulk = db.col.initializeOrderedBulkOp(),
objectList = [{}, {}, ..., {}], // array with thousands of records
counter = 0,
metadata = {
dateTime : '111111111',
groupId : 'some hash',
batchId : 'other hash'
};
objectList.forEach(function(obj) {
obj["dateTime"] = metadata.dateTime;
obj["groupId"] = metadata.groupId;
obj["batchId"] = metadata.batchId;
bulk.insert(obj);
counter++;
if (counter % 500 == 0) {
bulk.execute();
bulk = db.col.initializeOrderedBulkOp();
}
});
// Catch any under or over the 500's
if (counter % 500 != 0) {
bulk.execute();
}