[英]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.