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

Node.js 如何在MongoDB中插入500万条记录?,node.js,mongodb,Node.js,Mongodb,我在这里试图在MongoDB中插入500万个文档,这花费了太多的时间。请给我建议一个更有效的方法。我在这里发布了数据库结构和相关查询(代码)。请看一下,并指出可以进行哪些改进以加快插入速度 数据库结构: { "_id" : { "msisdn" : "919899587091", "op" : "idea", "eid" : "547c0a0ccbbc64ce2b773488",

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

数据库结构:

    { 
        "_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) {

            });
        });

我认为您正在手动执行聚合管道的$out阶段的用途

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


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

或许可以尝试@MarkusWMahlberg。它可能不是你的英语方言,但它是英语。@200成功英语,也许是这样。但(在印度以外)几乎没有广为人知。我们应该坚持所有英语方言的共同单位。我不想再给那个500号男人打电话了……;)@200_成功好吧,我认为这个想法是为了确保尽可能多的人能够理解一个问题,以最大限度地增加能够回答的人数。但我会认为这是理所当然的,从现在起,我会尝试用伦敦警察来回答我的问题……;)@维卡什:“时间太多”到底是什么?我们说的是秒吗?分钟?小时?关于什么样的系统和硬件?我有这样的要求,在db选择和另一个db粘贴上。请建议我更好的方法。您可以使用$out,然后使用cloneCollection,以避免在节点上下文中复制数据。谢谢回复,我想每一个小时合并一次结果。有可能吗?请建议我。我们可以将结果从另一个数据库粘贴到另一个数据库吗?对于与时间表有关的问题,我认为cronjob可以完成这项工作。“粘贴”是什么意思?