繁体   English   中英

如何使用Node.js驱动程序在mongoDB中多次插入数组?

[英]How to insert an array multiple times in mongoDB using the Node.js driver?

我试图使用mongodb-node.js驱动程序插入任何给定数组中包含的多个对象。 我的意图是修改每个对象的内容,并立即将这些对象保存在数据库中。 以下代码说明了我想做的事情。

var MongoClient = require("mongodb").MongoClient;
var URL = "mongodb://localhost:27017/database";

MongoClient.connect(URL, function(err,db) {
  if(err) console.log(err);

  var array = []; // an array that serves as a data source

  for(var i=0; i<10; i++) {
    array.push({ key: i });
  };

  db.collection("collection_name", function(err,col) {
    if(err) console.log(err);

    // --- "document insertion" --- //
    array.forEach(function(doc) {
      col.insert(doc);
    });
    // --- "document insertion" --- //

  });
});

由于数组中的每个对象都已插入数据库中,因此可以很好地工作。 但是,我想多次执行此操作。 换句话说,我正在尝试在for循环或while循环内运行“文档插入”代码,在这些代码中,每次迭代都会通过某些函数修改数据,然后将其保存在mongoDB中,但这根本行不通。

我尝试了以下情况,但没有运气,因为好像for循环和while循环只执行了一次。

// --- "document insertion" --- //
for(var j=0; j<n; j++) { /* where n > 1 */
  /* someFunction() might be executed to alter the content of the objects */
  array.forEach(function(doc) {
    col.insert(doc);
  });
};
// --- "document insertion" --- //

这也不起作用。

// --- "document insertion" --- //
while(--n) { /* where n > 1 */
  /* someFunction() */
  array.forEach(function(doc) {
    col.insert(doc);
  });
};
// --- "document insertion" --- //

我想对包含更复杂的架构设计的大型数组(大于1万个文档)执行多次。 for或while 循环试图模拟时间的步调,数组中的每个对象都应该随着时间的流逝变化 我的目标是为数组中的所有对象保存每个时间步。 考虑到“文档插入”代码段似乎只执行一次,我该如何实现? 我希望我已经清楚地表达了自己。

任何评论都受到好评和赞赏。 谢谢你的帮助。

问题是,MongoDB的Node.js的司机将增加一个_id插入文档前财产(如简单地提到这里 ),即你的数组元素将有一个_id第一循环之后财产。 在循环的第二次运行中,这将导致重复的键异常,因此文档只能插入一次。 将回调添加到insert并写出如下错误时,您可以自己查看问题:

...
col.insert(doc, function(err) {
    if (err) {
        console.log(ErrorEvent);
    }
});
...

errmsg:'E11000重复键错误集合:...

快速修复方法如下所示:

...
array.forEach(function (doc) {
    col.insert(doc);
    delete doc._id;
});
...

处理完数组后,使用isertMnay()插入文档数组

https://docs.mongodb.com/manual/tutorial/insert-documents/#write-op-insertmany

db.collection("collection_name", function(err,col) {
if(err) console.log(err);

// --- "document insertion" --- //

  col.insertMany(doc);

// --- "document insertion" --- //

  });
  });

正如您提到的用于10k文档的,使用for循环或while循环并不是一个好主意。 这会使您的节点挂起。 如果使用异步模块,则它可以处理循环。

例:

说一千遍

async.times(1000, function(n, next) {
    array.forEach(function (doc) {
        col.insert(doc);
        next(err, doc);
    });
}, function(err, docs) {
    // we should now have 1000 doc. If you want to use. :)
});

这将并行运行。 如果要使其成为系列,请使用timesSeries而不是times

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM