如何使用node.js将数组插入到mongodb中

我有一个数组像[ 570dec75cf30bf4c09679deb, 56fe44836ce2226431f5388f ] 。 现在我想插入这个新的集合名为notifications喜欢

 { "_id": ObjectId("57bd39c9734ff3602a312b33"), "userId": ObjectId("570dec75cf30bf4c09679deb") } and { "_id": ObjectId("57bd39c8734ff3602a312b32"), "userId": ObjectId("56fe44836ce2226431f5388f ") } 

我已经在node.js中写了一个查询来插入这个,但它插入数组的最后一个元素两次这样的

 { "_id": ObjectId("57bd39c9734ff3602a312b33"), "userId": ObjectId("56fe44836ce2226431f5388f ") } and { "_id": ObjectId("57bd39c8734ff3602a312b32"), "userId": ObjectId("56fe44836ce2226431f5388f ") } 

我写这样的查询

app.js

 router.post('/creatList', function(req,res){ console.log(req.body.email); var emails = req.body.email; if(req.body.wData.wishListType == 'Shared'){ var findUsers = function(db, callback) { var cursor; cursor = db.collection('users').find({email: { $in: emails }}) cursor.toArray(function(err, docs){ if(err){ callback(new Error("Some problem")); } else { callback(null,docs); } }); }; MongoClient.connect(config.database, function(err, db) { assert.equal(null, err); findUsers(db, function(err,docs) { db.close(); console.log(docs); for(var key in docs){ console.log(key); var ids = docs[key]._id; console.log(ids); var insertDocument = function(db, callback) { db.collection('notifications').insert({ "userId" : ids, },function(err, result) { assert.equal(err, null); console.log("Inserted a document into the notifications collection."); callback(); }); }; MongoClient.connect(config.database, function(err, db) { assert.equal(null, err); insertDocument(db, function() { db.close(); }); }); } }); }); }); 

您基本上需要重新映射您的结果users.find(),以便它们将匹配您的通知集合的模式。 这应该工作:

 var docsToInsert = docs.map(function (doc) { // this assumes your users collection has an _id that you actually want to use as the reference for you notifications.userId field // actually, you probably want "return {"userId": ObjectID(doc._id)};" since you are using the native mongodb api return { "userId": doc._id }; }); 

所以,稍微简化一下剩下的就是:

 router.post('/creatList', function (req, res) { console.log(req.body.email); var emails = req.body.email; if (req.body.wData.wishListType == 'Shared') { var findUsers = function (db, callback) { var cursor; cursor = db.collection('users').find({ email: { $in: emails } }); cursor.toArray(function (err, docs) { if (err) { callback(new Error("Some problem")); } else { callback(null, docs); } }); }; MongoClient.connect(config.database, function (err, db) { assert.equal(null, err); findUsers(db, function (err, docs) { db.close(); console.log(docs); var docsToInsert = docs.map(function (doc) { // this assumes your users collection has an _id that you actually want to use as the reference for you notifications.userId field // actually, you probably want "return {"userId": ObjectID(doc._id)};" since you are using the native mongodb api return { "userId": doc._id }; }); MongoClient.connect(config.database, function (err, db) { assert.equal(null, err); db.collection("notifications").insert(docsToInsert, function (err, result) { if (err) { // handle the err however you like throw err; } db.close(); }); }); }); }); } });