2014-02-15 40 views
0

在一個節點應用程序中,從一個貓鼬查詢中,我嘗試在每個結果的對象上添加一個新值。nodejs異步解析並修改mongodb的json對象列表

Sscategory.find({}, null, {sort:{'system_name':1}}, function (err, sscategories) {   
    var i = 0; 
    async.each(sscategories, function(sscategory, err) { 
     Marker2sscategory.count({'_sscategory' : sscategory._id}, function(err, count) { 
      if (err) return console.log(err); 
      sscategories[i].markerNumber = count; 
      i++; 
     }); 
    }); 
    console.log(sscategories); 
}); 

問題是我的對象不變......計數查詢中的值「markerNumer」沒有出現在我的'sscategories'對象列表中。

這裏是日誌:

[ { name_fr: 'Aménagement de locaux', 
name_en: 'Aménagement de locaux', 
system_name: 'amenagement_de_locaux', 
_id: 52fe27664139302d2c151449, 
__v: 0, 
uptade_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET), 
create_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET) }, 
{ name_fr: 'Animaux domestiques', 
name_en: 'Animaux domestiques', 
system_name: 'animaux_domestiques', 
_id: 52fe27664139302d2c15144b, 
__v: 0, 
uptade_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET), 
create_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET) }, 
{ name_fr: 'Architecte', 
name_en: 'Architecte', 
system_name: 'architecte', 
_id: 52fe27664139302d2c15144e, 
__v: 0, 
uptade_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET), 
create_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET) }, 
{ name_fr: 'Restaurant', 
name_en: 'Restaurant', 
system_name: 'restaurant', 
_id: 52fe27664139302d2c151451, 
__v: 0, 
uptade_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET), 
create_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET) }, 
{ __v: 0, 
_id: 52fe27664139302d2c15145b, 
name_de: 'aarrrr', 
name_en: 'Service de traiteur', 
name_fr: 'Service de traiteur', 
system_name: 'service_de_traiteur', 
uptade_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET), 
create_date: Fri Feb 14 2014 15:25:42 GMT+0100 (CET) } ] 

感謝你的幫助。

回答

1

已解決! 我與異步系統工作不好。

所以最好的方法是在瀑布中使用異步庫並使用async.each的回調函數。

此代碼:

var countMarker = function(sscategory, callback) { 
    Marker2sscategory.count({'_sscategory' : sscategory._id}, function(err, count) { 
     if (err) return console.log(err); 
     callback(null, count); 
    }); 
}; 

async.waterfall([ 
    function(callback) { 
     // select sub categories 
     Sscategory.find({}, null, {sort:{'system_name':1}}, function (err, sscategories) { 
      callback(null, sscategories); 
     }); 
    }, 
    function(sscategories, callback) { 
     var arr = []; 
     // for each subcategory, count markers 
     async.each(sscategories, function(sscategory, callback) { 
      countMarker(sscategory, function(err, count) { 
       if (err) return console.log(err); 
       sscategory.markerNumber = count; 
       arr.push(sscategory); 
       callback(); 
      }); 
     }, function(err) { 
      callback(null, arr);  
     }); 
    } 
], function(err, result) { 
    console.log(result); // final result, can render in template here   
});