如何从一个集合中获取数据并插入Nodejs中的另一个集合?

时间:2017-06-20 08:27:28

标签: node.js mongodb express collections insert

使用Nodejs和MongoDB,我是nodejs的新手。我需要知道如何从一个集合中获取数据并附加一些额外的数据并插入到另一个集合中。

db.collection('collection1').find({ "Id" : 12345 }).toArray(function(err, result){ 
   db.collection('collection2', function(err, collection){
       collection.insert({
          //some data
       })
   })
})

当我尝试使用此代码时,它不起作用,它给出了我错误插入没有定义。

感谢, 约翰。

2 个答案:

答案 0 :(得分:0)

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
        }
    })
})

还有一件事,如果结果数组长度超过那个,你想分别插入然后使用promise

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
 });
})

但如果你有一个非常大的文档,那么就像Neil Said那样做。使用游标逐个读取集合并修改它们并将它们插入到其他数据库中。

答案 1 :(得分:0)

  

您可以使用回调库,例如async或Promises Q Promise

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()

            }
        });
    }

]);