【问题标题】:Mongodb - multi-stages query - calculate, compare and return resultsMongodb - 多阶段查询 - 计算、比较和返回结果
【发布时间】:2021-12-28 09:08:44
【问题描述】:

我的mongodb文档如下:

[
  {
    _id: '5e839a223552e431fxd3c979',
    dateTime: '2020-03-31T19:29:41.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 30,
    details: {
      serviceId: 'serv_a'
    }
  },
  {
    _id: '5e839a223559e431fxd3c979',
    dateTime: '2020-03-31T19:29:42.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 10,
    details: {
      serviceId: 'serv_b'
    }
  },
  {
    _id: '5e839a223552ed82fxd3c979',
    dateTime: '2020-03-31T19:29:43.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 15,
    details: {
      serviceId: 'serv_a'
    }
  },
  {
    _id: '5e8902223552e431fxd3c979',
    dateTime: '2020-03-31T19:29:44.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 55,
    details: {
      serviceId: 'serv_a'
    }
  },
  {
    _id: '5e839a223552e43jjid3c979',
    dateTime: '2020-03-31T19:29:45.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 7,
    details: {
      serviceId: 'serv_b'
    }
  },
  {
    _id: '5e839a223552e431fx0c3979',
    dateTime: '2020-03-31T19:29:46.259Z',
    regionId: 'eg',
    transId: 'serviceFee',
    revenue: 120,
    details: {
      serviceId: 'serv_c'
    }
  },
  {
    _id: '5e839a22ggt2e431fxd3c979',
    dateTime: '2020-03-31T19:29:47.259Z',
    regionId: 'us',
    transId: 'serviceFee',
    revenue: 500,
    details: {
      serviceId: 'serv_a'
    }
  },
]

查看我们可以说的文件:

  • 有两个区域,根据regionId[eg,us]
  • 根据serviceId,共有三种服务:[serv_a, serv_b, serv_c]
  • 每个文档都显示了特定地区特定服务的收入。

这就是我想要的:

  • 我想知道特定地区(例如)中表现最好的服务(总收入最高)。
  • 我也想知道同一地区表现最差的服务。
  • 所以预期的结果应该是:
    • 'eg' 地区表现最佳的服务是:serv_c
    • 该地区表现最差的服务是:serv_b

所以从我的基本理解来看,我认为我需要找到一种方法来计算该地区每项服务的总收入(例如),然后在总数之间进行比较以决定哪个是最高的,哪个是最低的!我想我应该使用 mongodb aggregate 函数,但我不知道在这种情况下如何使用它。

【问题讨论】:

  • 您可以使用聚合阶段$group,以及$sum$max$min等聚合运算符。

标签: mongodb nosql nosql-aggregation


【解决方案1】:

我想我想通了。 这是 javascript 中的一个示例,显示了我是如何做到的:

var bestPerformingService = 'ph_besterviceId'; // <-- value placeholder
var worstPerformingService = 'ph_worstServiceId' // <-- value placeholder
var trId = 'serviceFee'; // <-- selected transId
var regId = 'eg'; // <-- selected regionId
var resultArray = await records_revenues_model.aggregate([
   {
      $match: {
         regionId: regId,
         transId: trId,
      }
   },
   {
      $group: {
         _id: '$details.serviceId',
         totalRevenues: { $sum: '$revenue' },
      }
   },
   {
      $sort: { totalRevenues: -1 }
   },
]).exec() || [];

try {
   bestPerformingService = resultArray[0]._id;
   worstPerformingService = resultArray[resultArray.length - 1]._id;
} catch (error) {
   methods.log(`safed error : ${error}`);
}

console.log(`best performing service: ${bestPerformingService}`);
console.log(`worst performing service: ${worstPerformingService}`);

// expected outcome:
// best performing service: serv_c
// worst performing service: serv_b

我希望有一天这对某人有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多