2015-10-15 136 views
1

我正在嘗試爲我的IT公司自動執行一些數據處理任務。我需要能夠遍歷集合,找到具有給定數字ID(不是ObjectID)的所有文檔,並將它們作爲數組字段添加到來自不同集合的文檔。這就是我如何嘗試它:如何使用mongoose和strict:false模式將字段添加到mongoDB文檔中?

voter.find({"District" : {"$eq" : "D"}}).stream() 
    .on('data', function (doc) { 

     var reg = new RegExp(doc._doc.Registration_Number, "i"); 
     history.find({"Registration_Number" : {"$eq" : Number(doc._doc.Registration_Number)}}, function (err, docs) { 
     var arr = new Array(); //In the context of a single voter! 
     u.each(docs, function (v, k) { 
      if (v) { 
      console.log(v._doc.ElectionDate); //Only if Registration_Number of voter matches history doc. 
      arr.push(v._doc.ElectionDate); 
      } 
     }); 

     //Now we have array of history 
     doc.update({"Registration_Number" : {"$eq" : Number(doc._doc.Registration_Number)}}, {VotingHistory : arr}, {multi : true}, function (error, num) { 
      if (err) console.log("SOMETHING WENT VERY WRONG"); 
      console.log(dat); 
     }); 

     }); 
    }) 
    .on('error', function (err) { 
     console.log(err); 
    }) 
    .on('end', function() { 
     console.log("Ending voter stream."); 
    }) 

更新回調不閃光,但我已經嘗試了voter.find()具有相同的查詢和它的每一個我使用一個有效的Registration_Number時間正好返回一個選民。我需要使用不可預知的字段名稱自動執行此操作,所以我想盡可能避免使用模式。我目前的模式是裸露的骨骼:

var mongoose = require('mongoose'); 
var voter = new mongoose.Schema({}, { 
    strict: false, 
    collection: 'voters' 
}); 

module.exports = mongoose.model('voter', voter); 

任何人都有一個想法,我可以使這項工作?這個問題類似於其他一些問題,但是我看到的每個問題都以model.update()回答,我似乎無法正常工作。

我的代碼運行一會兒只打印出ElectionDate,並且更新回調從不觸發。當我讓它運行在此結束錯誤:

MY_DIRECTORY\THE_APP\node_modules\mongoose\lib\query.js:2008 
     oldCb(error, result ? result.result : { ok: 0, n: 0, nModified: 0 }); 
    ^
TypeError: object is not a function 
    at callback (MY_DIRECTORY\THE_APP\node_modules\mongoose\lib\query.js:2008:7) 
    at Object.<anonymous> (MY_DIRECTORY\THE_APP\node_modules\mongoose\node_modules\kareem\index.js:160:11) 
    at Object._onImmediate (MY_DIRECTORY\THE_APP\node_modules\mongoose\node_modules\mquery\lib\utils.js:137:16) 
    at processImmediate [as _immediateCallback] (timers.js:354:15) 
15 Oct 09:13:31 - [nodemon] app crashed - waiting for file changes before starting... 

回答

0

的解決方案,雖然不漂亮,是修改doc._doc和使用覆蓋:在更新功能,真正的選項。完整代碼:

voter.find({"District" : {"$eq" : "D"}}).stream() 
    .on('data', function (doc) { 

     var reg = new RegExp(doc._doc.Registration_Number, "i"); 
     history.find({"Registration_Number" : {"$eq" : Number(doc._doc.Registration_Number)}}, function (err, docs) { 
     var arr = new Array(); //In the context of a single voter! 
     u.each(docs, function (v, k) { 
      if (v) { 
      console.log(v._doc.ElectionDate); //Only if Registration_Number of voter matches history doc. 
      arr.push(v._doc.ElectionDate); 
      } 
     }); 

     //Now we have array of history 
     doc._doc.VotingHistory = arr; 
     console.log(doc._doc); 
     voter.update({ "Registration_Number" : doc._doc.Registration_Number}, doc._doc, {overwrite : true }, function (er, num) { 
      if (er) console.log("ERRRRRRRRRRRRRRRRRRRRRRRRRR"); 
      console.log("NUMBER AFFECTED (should always be 1) : " + num); 
     }); 

     }); 
    }) 
    .on('error', function (err) { 
     console.log(err); 
    }) 
    .on('end', function() { 
     console.log("Ending voter stream."); 
    }); 
相關問題