简体   繁体   English

node.js从mongodb异步解析和修改json对象列表

[英]nodejs async parse and modify list of json object from mongodb

In a node app, from a mongoose query, I try to add a new value on each result's object. 在节点应用程序中,从猫鼬查询中,我尝试在每个结果的对象上添加一个新值。

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

Problem is my object doesn't change ... The value "markerNumer" from the count query doesn't appear in my 'sscategories' objects list. 问题是我的对象没有改变...计数查询中的值“ markerNumer”没有出现在我的“ sscategories”对象列表中。

Here is the log : 这是日志:

[ { 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) } ]

Appreciate your help. 感谢您的帮助。

Resolved ! 解决 ! I worked bad with the asynchronus system. 我在异步系统上工作不好。

So the good way was to use the async library in waterfall and use a callback for async.each. 因此,好的方法是在瀑布中使用异步库,并对async.each使用回调。

This code works : 此代码有效:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM