获取多个猫鼬查询的结果

时间:2018-08-19 23:48:43

标签: mongoose es6-promise

我正在使用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.
  })

1 个答案:

答案 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)
})