如何在MongoDB中插入500万条记录?

时间:2015-06-05 06:50:56

标签: node.js mongodb

我在这里试图在MongoDB中插入500万个文档,这需要花费太多时间。请建议我一个更有效的方法。我这里发布了db结构和相关查询(代码)。请查看它并指出可以加快插入速度的改进。

数据库结构:

    { 
        "_id" : {
            "msisdn" : "919899587091", 
            "op" : "idea", 
            "eid" : "547c0a0ccbbc64ce2b773488", 
            "cid" : "547c0a8ecbbc64cf2b773488", 
            "d" : ISODate("2015-05-26T04:30:00.000+0000")
        }, 
        "value" : {
            "unq" : NumberInt(1), 
            "ut" : "NNN"
        }
    }

高达500万。

我正在使用聚合,如下所示:

    var v = db.collection(collectionname).aggregate([{$match:{'@timestamp':             {'$gte':new Date(starttime), '$lt':new Date(endtime)},'eid':{$ne:'-'},ut:{$ne:'-'}}},
        {$project:{'msisdn':"$msisdn",'op':'$op','eid':'$eid','cid':'$cid','ut':'$ut','mi':{'$millisecond':'$@tim`enter code here`estamp'},'m':{'$minute':'$@timestamp'},'s':{'$second':'$@timestamp'},d:'$@timestamp'}},
        {$project:{'msisdn':"$msisdn",'op':'$op','eid':'$eid','cid':'$cid','ut':'$ut','d':{'$subtract':['$d',{'$add':[{'$multiply':['$m',60,1000]},{'$multiply':['$s',1000]},'$mi',1800000]}]}}},
        {$group : {'_id' : {'msisdn':"$msisdn",'op':'$op','eid':'$eid','cid':'$cid','d':'$d'},'unq':{$sum:1},'uts':{$addToSet:'$ut'}}},
        {$project:{'_id':'$_id','value':{'unq':'$unq',
      'ut':{ $cond: {if: {$setIsSubset:[['NNN'],'$uts']} ,then: 'NNN',
         else: { $cond: {if: {$setIsSubset:[['RNN'],'$uts']} ,then: 'RNN',
           else:{ $cond: {if: {$setIsSubset:[['RRN'],'$uts']} ,then: 'RRN',else:'RRR'}}
                }}
          }}} }
        }],{ allowDiskUse: true, cursor: {batchSize: 1000}});

    var bulk = db.collection(outcollectionname).initializeUnorderedBulkOp();

    v.on('data', function(data){ 
            bulk.insert(data);  
        });

    v.on('end', function(){ 
    bulk.execute(function(err, result) {

            });
        });

1 个答案:

答案 0 :(得分:3)

我这是你手动做的聚合管道的$ out阶段。

http://docs.mongodb.org/manual/reference/operator/aggregation/out/

它将结果存储到另一个集合中。

这可以避免将对象复制到nodejs上下文中并将其复制回mongodb。