gpt4 book ai didi

node.js - 使用异步并行进行多个 Mongoose 调用

转载 作者:太空宇宙 更新时间:2023-11-03 22:46:43 25 4
gpt4 key购买 nike

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

我们想要找到以下信息:- 我们想要列出每个索引的 ns- 我们想要列出具有 _id 的用户- 我们想要列出每个有键的索引的 ns(是的,你是对的,这是一组荒谬的查询,但它们会在每个 mongo 数据库上返回一些内容。)

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

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

但是如果我想使用 async,我该怎么做呢?因此尝试了以下方法来并行运行它们:

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

这给了我一个错误声明

task(_restParam(function (err, args) { ^ TypeError: object is not a function

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

======继Jigars的精彩回复后,我们离答案更近了=====Jigars 的出色答案现在可以了,保留下面的内容如果有人有同样的问题

/// So lets do it with async Map instead
var queries = [];
queries.push(function (cb) {
try {
result = Indexes.find().exec();
cb(null, result);
} catch(e) {
cb(e);
}
})

queries.push(function (cb) {
try {
result = Users.find({ _id: {$ne: null}}).exec();
cb(null, result);
} catch(e) {
cb(e);
}
})

queries.push(function (cb) {
try {
result = Indexes.find({ key : {$ne : null}}).exec();
cb(null, result);
} catch(e) {
cb(e);
}
})

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

var res1 = docs[0]; // result of queries[0]
for (var opts in res1){
console.log("In res1 we got " + res1[opts])
}
var res2 = docs[1]; // result of queries[1]
for (var opts in res2){
console.log("In res2 we got " + res2[opts])
}
var res3 = docs[2]; // result of queries[2]
for (var opts in res3){
console.log("In res3 we got " + res3[opts])
}
})

所以并行现在可以工作,只是没有返回我想要的。 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。您还需要传递每个查询的结果值。当所有查询并行执行完毕后,同样的内容将以数组形式返回给您

关于node.js - 使用异步并行进行多个 Mongoose 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31939444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com