2017-06-20 173 views
0

我正在使用Nodejs和MongoDB,而且我是nodejs的新手。我需要知道如何從一個集合中獲取數據並追加一些額外的數據並插入到另一個集合中。如何從一個集合中獲取數據並將其插入到Nodejs中的另一個集合中?

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

當我嘗試這個代碼時,它不工作,它給我錯誤插入未定義。

謝謝, 約翰。

+0

你要在大多數實際情況下循環時需要控制回調。有了一個非常小的集合,你可以插入一個完整的數組。其他任何你可能應該使用「遊標」而不是'.toArray()'並處理每個結果。這取決於你實際想要在這裏做什麼,以及收藏的大小。這部分不是很清楚。 –

回答

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

還有一兩件事,如果結果數組的長度更是一個要插入,然後分別再使用承諾

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

只是如果他能夠插入文檔或不。 –

0

可以使用回調庫像async或承諾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() 

      } 
     }); 
    } 

]); 
相關問題