无法在monogDB中插入带有insertMany的10000条记录

时间:2017-06-16 08:44:33

标签: node.js mongodb

所以实际上我创建了一个在文档中插入超过10000条记录的脚本。所以我做了,首先我使用insertMany查询将10000条记录插入到我的集合中。但是,当我再次尝试插入相同数量的记录时,它不会插入到我的文档中。然后我尝试了5000条记录,但这些记录也没有插入。

那么这里有什么问题? MongoDB是否有记录限制?请帮助我。

这是我的剧本:

   var resultArr=[];
   var getUID = function () {
     return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
   }
   var date = new Date();    
   date.setDate(date.getDate() + 12);    

   for(var i=0;i<10000;i++){
       resultObj = {
           "guid" : (getUID() + getUID() + "-" + getUID() + "-4" +  getUID().substr(0, 3) + "-" + getUID()),
            title: 'something'
            }
            resultArr.push(resultObj);
            resultObj={};
        }

    db.getCollection('5891847dc654e8e2150b3bff').insertMany(resultArr, function (err, result) {
        print('data saved')
        if (err) {
            deferred.reject(err)
            db.close()
        };   
     });

1 个答案:

答案 0 :(得分:0)

请改用以下代码:

   var async = require('async');

   var resultArr = [];
   var getUID = function () {
     return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
   }
   var date = new Date();    
   date.setDate(date.getDate() + 12);    

   var count = 0;
   async.whilst(
     // Check to see if we continue
     function() { return count < 10000 },
     // The loop function
     function(callback) {
       count++;
       resultArr.push({
         "guid" : (getUID() + getUID() + "-" + getUID() + "-4" +  getUID().substr(0, 3) + "-" + getUID()),
         "title": "something"
       });
       if ( resultArray.length >= 1000 ) {
         db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
           resultArray.map(function(d) {
             return { "insertOne": { "document": d } }
           }),
           function(err,res) {
             resultArray = [];
             callback(err);
           }
         );
       } else {
         callback()
       }
     },
     // This is on completion or error
     function(err, n) {
       if (err) throw err;
       if ( resultArray.length > 0 ) {
         db.getCollection('5891847dc654e8e2150b3bff').bulkWrite(
           resultArray.map(function(d) { return {
             "insertOne": { "document": d }
           }),
           function(err,res) {
             resultArray = [];
             db.close();
           }
         );
       } else {
         db.close();
       }
     }
   );

这将使用async.whilst对内部异步调用的流控制拆分循环。这使得callback可以调用以继续&#34;循环&#34;所以你不要在节点上用同时运行的操作来炸毁调用堆栈。

当数组中的项目数量达到1000时,实际的.bulkWrite()调用是在循环内部进行的,这是驱动程序一次性发送的最大值。你可以做得更多,但我们正在节省记忆,这是关于&#34;甜蜜的地方&#34;。

在这里使用回调,我们清除数组并调用&#34;循环的回调&#34;为了让循环继续下去。

最后当&#34;循环&#34;完成之后,您通常会检查是否有任何未处理的内容,偶数为1000.在这种情况下,我们知道它是一个圆形数字,但我留下来显示什么与真实的清单有关。

因此该部分位于async.whilst的最终回调参数中,当循环完成时我们可以实现这个参数,然后我们可以退出。