首页 > 解决方案 > 条件求和mongodb聚合

问题描述

我正在尝试对带有条件的文档数组求和。

{
        $project: {
            watched: 1,
            numberOfWatched: {
                $sum: {
                    // $cond: {
                    //     if: {
                    //         $eq: ['$watched.status', true],
                    //         then: 1,
                    //         else: 0
                    //     }
                    // }
                       $cond: [
                        { $eq: ['$watched.status', true]},
                        1,
                        0
                    ]
                }
            },
            durationWatched: {$sum: "$watched.duration"}
        }
    }

这是我得到的输出。在这里,您可以看到我的监视数组中有一个状态为 true 的值。所以 numberOfWatched 应该是 1。而不是它返回 0。

[
   {
      "_id":"5bacb579921406542350d254",
      "watched":[
         {
            "_id":"5baf44ee2369280542a4c41e",
            "duration":24.083333333333332,
            "user_id":"5bacbb05d2b8e4577b038f43",
            "video_id":"5bacb5b1921406542350d25e",
            "module_id":"5bacb588921406542350d256",
            "course_id":"5bacb579921406542350d254",
            "createdAt":"2018-09-29T09:25:02.107Z",
            "updatedAt":"2018-09-29T09:25:02.107Z",
            "__v":0,
            "status":true
         }
      ],
      "numberOfWatched":0,
      "durationWatched":24.083333333333332
   }
]

标签: mongodbmongooseaggregation-framework

解决方案


你可以试试下面 $size$filter聚合

db.collection.aggregate([
  { "$project": {
    "watched": 1,
    "numberOfWatched": {
      "$size": {
        "$filter": {
          "input": "$watched",
          "cond": { "$eq": [ "$$this.status", true ] }
        }
      }
    },
    "durationWatched": {
      "$let": {
        "vars": {
          "dw": {
            "$filter": {
              "input": "$watched",
              "cond": { "$eq": [ "$$this.status", true ] }
            }
          }
        },
        "in": { "$sum": "$$dw.duration" }
      }
    }
  }}
])

推荐阅读