mongodb - 如何在整个集合中进行仅总和查询?
问题描述
我有这个收藏
{
"_id" : BinData(0, "JUw6VoBVdtqAQ2g7sn0sog=="),
"os_name" : "android"
}
我想在一个聚合查询中检索文档计数
os_android => count of documents where "os_name" = "android"
os_ios => count of documents where "os_name" = "ios"
total => the total count of document
我能怎么做 ?
我试试这个:
db.getCollection("myCollection").aggregate(
[
{$group:{
_id:{},
by_os_ios:{$sum:{$cond:[{os_name:"ios"},NumberInt(1),NumberInt(0)]}},
by_os_android:{$sum:{$cond:[{os_name:"android"},NumberInt(1),NumberInt(0)]}},
total:{$sum:1}}
},
{$addFields:{
"by_os.ios":"$by_os_ios",
"by_os.android":"$by_os_android"}},
{$project:{
_id:0,
by_os_ios:0,
by_os_android:0}}
]
);
但这不起作用:(我错过了什么?
解决方案
您错过$eq
了$cond
,您可以使用{ $eq:["$field_name", "value to matched"] }
db.getCollection("myCollection").aggregate([
{
$group: {
_id: {},
by_os_ios: { $sum: { $cond: [{ $eq: ["$os_name", "ios"] }, 1, 0] } },
by_os_android: { $sum: { $cond: [{ $eq: ["$os_name", "android"] }, 1, 0] } },
total: { $sum: 1 }
}
},
... // your other pipeline stages
])
第二种可能的方式,
$group
创建名为 root 的数组$project
使用总文档计数$size
$reduce
遍历根数组并检查条件,如果它的 ios 然后求和,如果它的 android 然后求和$add
并与当前的值对象合并$mergeObjects
推荐阅读
- c++ - 将指针 * 分配给指针 ** 时如何工作?
- redux - 在渲染父组件之前调用子组件的 mapStateToProps
- html - 视频文件 (.mp4|.mkv) 无法从外部服务器 rootDIr 加载
- python - 确保值列表中的每个值在 pandas 数据框的每一行中仅出现一次
- python - 如何使用 python json 访问 json 密钥?
- reactjs - 在 useEffect 中去抖动/限制 onChange 事件
- android - 为什么 TextEditingController 在某些设备上会崩溃?
- laravel - 我想要我的 if 条件来处理 laravel 控制器中的所有记录
- java - 重复键(尝试合并值 x 和 x)
- javascript - 如何检测特定浏览器版本或更高版本(jQuery)