我在这里试图在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) {
});
});
答案 0 :(得分:3)
我这是你手动做的聚合管道的$ out阶段。
http://docs.mongodb.org/manual/reference/operator/aggregation/out/
它将结果存储到另一个集合中。
这可以避免将对象复制到nodejs上下文中并将其复制回mongodb。