【问题标题】:How to use groupby in mongo along with addFields containing strings?如何在 mongo 中使用 groupby 以及包含字符串的 addFields?
【发布时间】:2021-07-26 20:36:39
【问题描述】:

我在 mongo 集合中有四个字段 SenderRecipientCreditDebit。其中 Credit 和 Debit 是字符串形式的数字。我需要根据SenderRecipient 进行分组并添加CreditDebit 的整数值,并根据贷方和借方的净值对结果进行排序

我有这样的数据库

Sender   Recipient  Credit  Debit
“Mike”   “John”      “600”   “-300” 
“Alis”   “Ajay”      “300”   “-800” 
“Arun”   “Ankit”     “360”   “-300” 
“Mike”    “Cris”      “0”    “-100”       

我需要这样的结果

Sender   Recipient  NetAmount
“Mike”    “John”        “300” 
Arun”     “Ankit”       “-60”
“Mike”    “Cris”        “-100”       
“Alis”    “Ajay”        “-500”

我试过这样做

DataModel.aggregate([
      {
        $group: {
          _id: {
            sender: '$ sender,
            recipient: '$recipient',
          },
        },
      },
      {
        $project: {
          credit: '$credit.creditAmount,
          debit: '$debit.debitAmount,
        },
      }, {
        $addFields: {
          netAmount: {
            $add: [{ $toInt: '$ credit }, { $toInt: '$ debit }],
          },
        }
      },
    ]);

但它没有给出预期的结果。

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:
    • $group by Sender and Recipient, sum Credit and Debit 使用 $toInt 转换为整数后的数量
    • $project 显示必填字段并使用 $addCreditDebit 字段求和
    • $match 检查NetAmount 不为零
    • $sort NetAmount 按降序排列
    db.collection.aggregate([
      {
        $group: {
          _id: {
            Sender: "$Sender",
            Recipient: "$Recipient"
          },
          Credit: { $sum: { $toInt: "$Credit" } },
          Debit: { $sum: { $toInt: "$Debit" } }
        }
      },
      {
        $project: {
          _id: 0,
          Sender: "$_id.Sender",
          Recipient: "$_id.Recipient",
          NetAmount: { $add: ["$Credit", "$Debit"] }
        }
      },
      { $match: { NetAmount: { $ne: 0 } } },
      { $sort: { NetAmount: -1 } }
    ])
    

    Playground

    【讨论】:

    • 请您帮忙扩展一个条件:分组后,我需要过滤掉NetAmount不等于0的记录
    • 谢谢,如果您能解决另一个疑问,我们将不胜感激。排序和匹配后,我需要得到每组的前 3 条记录。你也可以帮忙吗
    • 如果您提出新问题并提供详细信息会很好。
    • 如你所说,我已将其更新为新问题,请帮助解决这个问题。这是问题的链接:stackoverflow.com/questions/6738919
    猜你喜欢
    • 2021-07-27
    • 2021-01-21
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多