如何从一个集合中获取数据并将其插入到Nodejs中的另一个集合中?
问题描述:
我正在使用Nodejs和MongoDB,而且我是nodejs的新手。我需要知道如何从一个集合中获取数据并追加一些额外的数据并插入到另一个集合中。如何从一个集合中获取数据并将其插入到Nodejs中的另一个集合中?
db.collection('collection1').find({ "Id" : 12345 }).toArray(function(err, result){
db.collection('collection2', function(err, collection){
collection.insert({
//some data
})
})
})
当我尝试这个代码时,它不工作,它给我错误插入未定义。
谢谢, 约翰。
答
db.collection('collection1').find({ "Id" : 12345 }).toArray(function(err, result){
//do the modification here
db.collection('collection2').insert(modifiedResult, function(err, result){
if(err) {
//log error
}else{
//log result
}
})
})
还有一两件事,如果结果数组的长度更是一个要插入,然后分别再使用承诺
db.collection('collection1').find({ "Id" : 12345 }).toArray(function(err, result){
//do the modification here
Promise.all(modifiedResult.map((eachModifiedResult)=>{
return db.collection('collection2').insert(eachModifiedResult);
}).then((result)=>{
//result of the insert
}).catch((err){
//err if any happen
});
})
但是,如果你有一个非常大的文档,然后做尼尔说过。使用光标逐个读取集合并修改它们并将它们插入到其他数据库中。
+0
很确定问题是要求在这里插入'result'数组中的所有内容。看不到如何添加'if'和'else'真的有帮助。 –
+0
只是如果他能够插入文档或不。 –
答
var collectionData = null;
var modifiedResult = null;
//这里我使用异步库,以避免callbackHell
async.series([
// for get data from collection 1.
function(cb) {
var criteria = {
"Id": 12345
}
db.collection('collection1').find(criteria).toArray(function(dbErr, dbResult) {
if (err) {
cb(dbErr)
} else {
collectionData = dbResult;
cb()
}
})
},
// Append Data in collectionData
function(cb) {
// do you work here to append data in collectionData
modifiedResult = extendedData; // this is just an example you need to work on it
cb();
},
// Update collection 2 here
function(cb) {
db.collection('collection2').insert(modifiedResult, function(err, result) {
if (err) {
cb(dbErr)
} else {
collectionData = dbResult;
cb()
}
});
}
]);
你要在大多数实际情况下循环时需要控制回调。有了一个非常小的集合,你可以插入一个完整的数组。其他任何你可能应该使用“游标”而不是'.toArray()'并处理每个结果。这取决于你实际想要在这里做什么,以及收藏的大小。这部分不是很清楚。 –