mongoose mongodb聚合$sum返回0而不是数组中整数的实际总和

liwlm1x9  于 2023-05-13  发布在  Go
关注(0)|答案(2)|浏览(257)

我的文档看起来像这样:

{
  "_id": "2023-04-08",
  "dailyNotes": [
    {
      "therapyDiscipline": "PT",
      "individual": [
        60,
        45,
        30,
        75,
        55
      ],
      "concurrent": [
        69
      ],
      "coTreat": [
        67
      ]
    }
  ]
}

我想individual数组中的所有数字求和,并创建一个新文档,其中只有individual键具有数组的总和。
以下是我到目前为止尝试过的方法,但没有成功

{
$group: 
{
  _id: '$_id',
  individual:{
    $sum: '$dailyNotes.individual'
  }
}
}

这将返回:

{
  "_id": "2023-04-08",
  "individual": 0
}

我不明白为什么返回0,而应该返回265

我尝试了一些其他的解决方案,但它们也导致了0的总和:

{
$project: {
  individual: {
    $reduce: {
        input: "$dailyNotes.individual", 
        initialValue: 0,
        in: { $sum: [ "$$value", "$$this" ]}
    }
  }
}
}
{
$project: 
{
  individual: {
    $sum: '$dailyNotes.individual'
  }
}
}

有人能解释一下为什么它返回0而不是265,以及如何解决这个问题吗?

**[更新]:(多条记录(最多3条)的示例)**对于以下文档:

{
   "_id":"2023-04-08",
   "dailyNotes":[
      {
         "therapyDiscipline":"PT",
         "individual":[
            60,
            45,
            30,
            75,
            55
         ]
      },
      {
         "therapyDiscipline":"YT",
         "individual":[
            2,
            4
         ]
      }
   ]
}

这应返回为:

{
   "_id":"2023-04-08",
   "dailyNotes":[
      {
         "individual":265
      },
      {
         "individual":6
      }
   ]
}
ylamdve6

ylamdve61#

最简单的方法是将$map$sum一起使用

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      dailyNotes: {
        $map: {
          input: "$dailyNotes",
          in: { individual: { $sum: "$$this.individual" } }
        }
      }
    }
  }
])

playground
使用$reduce的替代方案

db.collection.aggregate([
  {
    $project: {
      _id: 1,
      dailyNotes: {
        $reduce: {
          input: "$dailyNotes",
          initialValue: [],
          in: { $concatArrays: [ "$$value", [ { individual: { $sum: "$$this.individual" } } ] ] }
        }
      }
    }
  }
])

playground

y0u0uwnf

y0u0uwnf2#

当前聚合管道返回0而不是期望的总和265的原因是$sum运算符期望一个值数组作为其输入。但是,在$sum运算符表达式中,将整个dailyNotes.individual数组作为单个值传递。因此,它不能对数组的值求和。
要解决这个问题,需要将$sum运算符与$reduce运算符结合使用,对单个数组求和。以下是如何修改聚合管道以实现此目的:

db.collection.aggregate([
  {
    $match: {
      _id: "2023-04-08"
    }
  },
  {
    $project: {
      individual: {
        $reduce: {
          input: "$dailyNotes.individual",
          initialValue: 0,
          in: {
            $add: [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  }
])

相关问题