在mongoose中找到与foreach的同步

时间:2014-02-17 15:30:37

标签: node.js mongodb mongoose

我想在里面用mongoose创建一个同步查询。

我的脚本是:

async.parallel(
    {
        team: function(callback){
            Object.keys(myobj[0]).each(function(name){
                db.model( 'myCollection', myCollection, myCollection ).find({ profile: name }, function( err, profile ){
                    if (err)
                        return callback(err);
                    callback(null, profile);
                });
            });
        },
    },
    function(e, r){
        console.log(r.team);
        // can use r.team
    }
);

但我有这个错误

错误:已经调用了回调。

2 个答案:

答案 0 :(得分:0)

team: function(callback){
            Object.keys(myobj[0]).each(function(name){
                db.model( 'myCollection', myCollection, myCollection ).find({ profile: name }, function( err, profile ){
                    if (err)
                        return callback(err);
                    callback(null, profile);
                });
            });
        },

它不会起作用,因为只要在forEach中找到第一个结果就会执行回调(each无效的javascript BTW)。检查async.map的异步文档或修改mongoose查询以查找与配置文件数组匹配的所有文档,因此您只执行1个查询并返回一组配置文件。

答案 1 :(得分:0)

您需要创建一个函数数组并使用clojure来保持每个数组元素。

function createfunc(obj) {
    var name = obj;

    return function(callback) {
        db.model( 'myCollection', myCollection, myCollection ).find({ profile: name }, function( err, profile ){
                    if (err)
                        return callback(err);
                    callback(null, profile);
                });
    }
}

var funcs = [];
Object.keys(myobj[0]).forEach(function(name) { funcs.push(createfunc(name)); });

async.parallel(funcs, function(e, r) { console.log(r.team); });