我正在尝试使用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" --- //
我想对包含更复杂模式设计的大型数组(大于 10k 文档)多次执行此操作。 for 或 while 循环试图模拟时间的节奏,数组中的每个对象都应该随着时间的流逝而变化。我的目标是保存数组中所有对象的每个时间步长。鉴于“文档插入”代码似乎只执行一次,我怎样才能实现这一点?我希望我已经清楚地表达了自己的意思。
任何评论都会受到热烈欢迎和赞赏。感谢您的帮助。
最佳答案
问题在于 mongoDB Node.js 驱动程序将添加 _id
插入文档之前的属性(如简要提到的 here ),即您的数组元素将有一个 _id
第一个循环之后的属性。在循环的第二次运行中,这将导致重复的键异常,因此文档仅插入一次。
您可以在向insert
添加回调时自己看到问题。并写出如下错误:
...
col.insert(doc, function(err) {
if (err) {
console.log(ErrorEvent);
}
});
...
errmsg: 'E11000 duplicate key error collection: ...
对此的快速修复可能如下所示:
...
array.forEach(function (doc) {
col.insert(doc);
delete doc._id;
});
...
关于arrays - 如何使用 Node.js 驱动程序在 mongoDB 中多次插入数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38492714/