Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用async并行进行多个mongoose调用_Node.js_Asynchronous_Mongoose - Fatal编程技术网

Node.js 使用async并行进行多个mongoose调用

Node.js 使用async并行进行多个mongoose调用,node.js,asynchronous,mongoose,Node.js,Asynchronous,Mongoose,我已经为此挣扎了一段时间,我似乎错过了一些非常明显的东西。举个例子。假设我想同时打三个电话。为了使其成为一个简单的示例或易于测试,假设我们需要一个脚本,该脚本向mongodb询问以下信息 我们希望找到以下信息: -我们想列出每个索引的N -我们希望列出具有_id的用户 -我们想列出每个索引中有一个键的n个 是的,你是对的,这是一组荒谬的查询,但它们在每个mongo数据库上都会返回一些东西 因此,在mongo db上执行此操作的简单脚本是: var mongoose = require("mong

我已经为此挣扎了一段时间,我似乎错过了一些非常明显的东西。举个例子。假设我想同时打三个电话。为了使其成为一个简单的示例或易于测试,假设我们需要一个脚本,该脚本向mongodb询问以下信息

我们希望找到以下信息: -我们想列出每个索引的N -我们希望列出具有_id的用户 -我们想列出每个索引中有一个键的n个 是的,你是对的,这是一组荒谬的查询,但它们在每个mongo数据库上都会返回一些东西

因此,在mongo db上执行此操作的简单脚本是:

var mongoose = require("mongoose");
var morgan = require('morgan');             // log requests to the console (express4)
var async = require('async');
mongoose.connect('mongodb://localhost/admin');



var Indexes = mongoose.model('system.indexes', {
    name: String,
    ns: String
});
var Users = mongoose.model('system.users', {
    user: String
})


        Indexes.find().exec(function(err, docs){
            for( var doc in docs ){
                console.log("Got Index " + docs[doc].ns);
            }
        })
        Users.find({ _id: {$ne: null}}).exec(function(err, docs){
            for (var doc in docs){
                console.log("And user " + docs[doc].user );
            }
        })
        Indexes.find({ key : {$ne : null}}).exec(function(err, docs){
            for (var doc in docs) {
                console.log("And Index with a key " + docs[doc].ns);
            }
        })
但是,如果我想使用异步,我该怎么做呢。 因此,尝试了以下方法来并行运行它们:

var mongoose = require("mongoose");
var morgan = require('morgan');             // log requests to the console (express4)
var async = require('async');
mongoose.connect('mongodb://localhost/admin');



var Indexes = mongoose.model('system.indexes', {
    name: String,
    ns: String
});
var Users = mongoose.model('system.users', {
    user: String
})


/// So lets do it with async Map instead
var queries = [];
queries.push(Indexes.find().exec());
queries.push(Users.find({ _id: {$ne: null}}).exec());
queries.push(Indexes.find({ key : {$ne : null}}).exec());

async.parallel(queries, function(err, docs){
    console.log("I've done some stuff");
})
这给了我一个错误声明

任务\u restParamfunction err,args{ ^TypeError:对象不是函数

但是有一个简单的方法解决这个问题。我如何使用异步映射或并行进行多个查找

======继Jigars出色的回答之后,我们离答案更近了===== Jigars很好的答案现在可以了,把东西放在下面 如果有人有同样的问题


现在并行工作,只是没有返回我想要的结果。res1、res2和res3中的结果看起来像js代码:

您的querys.push命令应该如下所示

queries.push(function (cb) {
    Indexes.find().exec(function (err, docs) {
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})    

queries.push(function (cb) {
    Users.find({ _id: {$ne: null}}).exec(function (err, docs) {
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})

queries.push(function (cb) {
    Indexes.find({ key : {$ne : null}}).exec(function (err, docs){
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})

async.parallel(queries, function(err, docs) {
    // if any query fails
    if (err) {
        throw err;
    }

    var res1 = docs[0]; // result of queries[0]
    var res2 = docs[1]; // result of queries[1]
    var res3 = docs[2]; // result of queries[2]
})
async以多个函数和回调函数作为参数。在每个函数完成后,您需要调用cb。
您还需要传递每个查询的结果值。当所有查询并行执行完毕后,同样的结果值将以数组形式返回给您

queries.push(function (cb) {
    Indexes.find().exec(function (err, docs) {
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})    

queries.push(function (cb) {
    Users.find({ _id: {$ne: null}}).exec(function (err, docs) {
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})

queries.push(function (cb) {
    Indexes.find({ key : {$ne : null}}).exec(function (err, docs){
        if (err) {
            throw cb(err);
        }

        // do some stuff with docs & pass or directly pass it
        cb(null, docs);
    });
})

async.parallel(queries, function(err, docs) {
    // if any query fails
    if (err) {
        throw err;
    }

    var res1 = docs[0]; // result of queries[0]
    var res2 = docs[1]; // result of queries[1]
    var res3 = docs[2]; // result of queries[2]
})
async以多个函数和回调函数作为参数。在每个函数完成后,您需要调用cb。
您还需要传递每个查询的结果值。当所有查询并行执行完成时,同样的结果将以数组形式返回给您。这真是一件好事,它比以前更接近工作状态。但是,res1、2和3包含java代码,而不是响应。在我的问题中,以您的示例对其进行了升级。还有其他一些返回,但它认为代码是函数的完整产物而不是返回,这似乎是我的错误。根据您的编辑更新了答案。想法是完成所有异步函数并通过cb传递最终输出。您可以浏览异步文档,其中有各种很好的示例。因此,现在请偷偷地关注一下p、 我到底该如何将变量发送到推送中。使用bind进行了尝试,但出现了错误…真的很好,它比以前更接近工作状态。但是,res1、2和3包含java代码,而不是响应。在我的问题中,以您的示例为例并对其进行了升级。虽然有一些东西回来了,但似乎我认为代码可能是错误的是函数的完整产品,而不是返回。根据您的编辑更新了答案。想法是完成所有异步函数并通过cb传递最终输出。您可以浏览异步文档,其中有各种很好的示例。因此,下面是一个潜在的跟进,我到底如何将变量发送到推送中。使用bind bu进行了尝试不要出错。。。