【问题标题】:Mongo - Aggregation of sum of values based on nameMongo - 基于名称的值总和聚合
【发布时间】:2019-04-15 16:36:21
【问题描述】:

我正在尝试执行聚合函数,以根据名称值计算成本和边际值的总和。因此,如果多个结果的名称为“Fake Provider”,我想要成本结果的总和和保证金结果的总和。

查询语句:

Pharmacy.aggregate([
{
  $match: {
    $and: [{ 'prescription.status': 'Ready for Pickup' }]
  }
},
{
  $project: {
    'insurance.primary.name': 1,
    'prescription.financial.cost': 1,
    'prescription.financial.margin': 1
  }
}
])

结果类似于:

[
  {
      "_id": "5cab98cd293bd54e94c40461",
      "insurance": {
          "primary": {
              "name": "Fake Provider 1"
          }
      },
      "prescription": [
          {
              "financial": {
                  "cost": "2.89",
                  "margin": "5.60"
              }
          },
          {
              "financial": {
                  "cost": "0.88",
                  "margin": "1.24"
              }
          }
      ]
  },
  {
      "_id": "5cab98d0293bd54e94c40470",
      "insurance": {
          "primary": {
              "name": "Fake Provider 1"
          }
      },
      "prescription": [
          {
              "financial": {
                  "cost": "3.22",
                  "margin": "9.94"
              }
          },
          {
              "financial": {
                  "cost": "2.57",
                  "margin": "9.29"
              }
          },
          {
              "financial": {
                  "cost": "2.03",
                  "margin": "10.17"
              }
          }
      ]
  }
]

我试图创建一个组语句,但没有任何运气。此外,成本和利润值当前存储为字符串。

  $group: {
    _id: '$insurance.primary.name',
    Financial: {
      $push: {
        id: '$insurance.primary.name',
        name: '$insurance.primary.name',
        cost: '$prescription.financial.cost',
        margin: '$prescription.financial.margin'
      }
    }
  }

我想得到类似的结果:

 [
{
  "primaryInsurance": "Fake Provider 1",
  "totalFinancialCost": "11.59",
  "totalFinancialMargin": "36.24"
},
{
  "primaryInsurance": "Fake Provider 2",
  "totalFinancialCost": "12.82",
  "totalFinancialMargin": "22.16"
}
]

我想我有一个解决方案,它使用查找和投影返回结果,然后使用 javascript 映射结果并执行加法。但是,我更愿意在数据库级别执行此操作。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    您必须先展开“处方”字段,然后再进行分组。试试这个管道:

    let pipeline = [
    {
      $unwind: {
        path: '$prescription'
      }
    },
    {
      $group: {
        _id: '$insurance.primary.name',
        totalFinancialCost: {
          $sum: { $convert: { input: '$prescription.financial.cost', to: "decimal" } } 
        },
        totalFinancialMargin: {
          $sum: { $convert: { input: '$prescription.financial.margin', to: "decimal" } } 
        }
      }
    }]
    

    请注意如何将这些值转换为十进制以执行求和。

    【讨论】:

    • 我收到此错误 - MongoError: Unrecognized expression '$convert' 。看起来我正在使用 v3.6.3 。此版本中可能不可用。
    • 尝试使用以下语句:$sum: { $toDecimal: '$prescription.financial.margin' }
    • MongoError: Unrecognized expression '$toDecimal' 这两个都只在版本 4.0.+ 中可用。如果在 v.3.6.3 中不可行,我将升级然后重试。
    • v4.0以后才有转换功能,所以要么更新,要么改变数据类型。
    猜你喜欢
    • 1970-01-01
    • 2013-06-10
    • 2022-01-07
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多