有条件的求和 MongoDB 聚合

4

我正在尝试根据条件对文档数组进行求和。

{
        $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
   }
]
1个回答

2
你可以尝试使用下面的$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" }
      }
    }
  }}
])

我需要使用$sum来完成这个任务,因为我需要在观看对象的duration字段下使用durationWatched执行相同的操作。 - Ahsan Aasim
似乎$filter也会过滤掉与筛选条件不匹配的整个数据。 - Ahsan Aasim
哦,我的错。是的,numberOfWatched可以。 - Ahsan Aasim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接