我正在使用Mongoose运行多个聚合查询,并且出于我的应用程序逻辑的目的,需要在同一位置访问这些聚合查询的结果。
我需要计算的一件事是集合中字段的平均值,另一件事是标准差。
Company.aggregate([{ $group: { _id: null, mean: {$avg: '$customers'}}}])
Company.aggregate([{ $group: { _id: null, std: {$stdDevPop: '$customers'}}}])
我知道我可以分别对这两者运行exec并使用then()
方法来分别获取结果,但是我将如何一起访问这些结果,然后一起使用这两个结果。我想我的问题比承诺更重要。有没有一种方法可以将上面的两个查询放入一个数组中,然后在数组中的两个promise都解决后再执行一个函数?
是否有一种组合诺言的方法,以便我可以在组合诺言中使用then()
?
编辑:
let q1 = Company.aggregate([{ $group: { _id: null, mean: {$avg: '$customers'}}}]),
let q2 = Company.aggregate([{ $group: { _id: null, std: {$stdDevPop: '$customers'}}}]),
queries = [q1, q2].map(q=>q.exec());
Promise.all(queries)
.then((results)=>{
const averageCustomers = results[0][0].mean;
const companies = Company.find({ customers: { $lt: averageCusomters } });
return companies.exec();
})
.then((results)=>{
//here I only have access to the companies that have less than average customers.
//I no longer have access to the average customers across
//all companies or their standard deviation.
})
答案 0 :(得分:0)
您正在寻找类似Promise.all()
之类的东西。您将从数组(results
)中的所有查询中获得结果。
let q1 = Company.aggregate([{ $group: { _id: null, mean: {$avg: '$customers'}}}]),
q2 = Company.aggregate([{ $group: { _id: null, std: {$stdDevPop: '$customers'}}}]),
queries = [q1, q2].map(q=>q.exec());
Promise.all(queries)
.then((results)=>{
console.log(results)
})