mongodb - 条件求和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
}
]
解决方案
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" }
}
}
}}
])
推荐阅读
- google-sheets - 如果它包含大型数据集的“1”,则计数一次
- java - 将 LinkedHashMap 转换为字符串数组
- algorithm - 如果图 G 的不同边成本 > 0(即没有两条边成本相同),那么 G 的每个最小瓶颈树是否也是最小生成树?
- c++ - 如何使用 FFMPEG API 解码到客户端分配的内存
- r - 在 R 中的地图中标记数据点
- javascript - 如何从带有阴影的 div 中切出一种圆形
- r - 使用 ggplot 更改箱线图上特定观察值的颜色
- javascript - 如何列出我的机器人所在的所有公会及其各自的 ID
- ios - 用于在多个单位之间转换值的动态数学
- javascript - 从道具值重新分配状态