在MongoDB中插入数千条记录时,快速添加相同的元数据?

时间:2015-11-05 12:24:36

标签: arrays performance mongodb

我希望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

1 个答案:

答案 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();
}