mongodb - 如何将 mongod db 查询更改为聚合
问题描述
我有三个查询,现在我想将其更改为 MongoDB 聚合,下面是代码:
db.mycollection.count({$and:[$requestB:{$exists:false},[$requestC:{$exists:false}]}) db.mycollection.count({requestB:{$exists:true}}) db.mycollection.count({requestC:{$exists:true}})
现在我想将此代码更改为聚合,但它不起作用
db.mycollection.aggregate( [ { $group: { '_id' : { user_id: '$user_id'}, requestA_count: { $sum: { $cond: [ {$and: [{$eq: ["$requestB", null]}, {$eq: ["requestC", null]}}}, 1, 0 ] } }, requestB_count: { $sum: { $cond: [ {requestB:{'$exists':true}}, 1, 0 ] } }, requestC_count: { $sum: { $cond: [ {requestC:{'$exists':true}}, 1, 0 ] } }, } }, { $project: { _id: 0, user_id: '$_id.user_id', requestA_count: 1, requestB_count: 1, requestC_count: 1 } } ] );
解决方案
您可以使用$type
代替$exists
inside $group
,
db.collection.aggregate([
{
$group: {
"_id": { user_id: "$user_id" },
requestA_count: {
$sum: {
$cond: [
{
$and: [
{ $ne: [{$type: "$requestA"}, "missing"] },
{ $eq: [{$type: "$requestB"}, "missing"] },
{ $eq: [{$type: "$requestC"}, "missing"] }
]
}, // you need to close bracket here not below
1, 0
]
}
},
requestB_count: {
$sum: { $cond: [{ $ne: [{ $type: "$requestB" }, "missing"] }, 1, 0] }
},
requestC_count: {
$sum: { $cond: [{ $ne: [ { $type: "$requestC" }, "missing" ] }, 1, 0] }
}
}
},
{
$project: {
_id: 0,
user_id: "$_id.user_id",
requestA_count: 1,
requestB_count: 1,
requestC_count: 1
}
}
])
推荐阅读
- c - C typedef 用于取消引用指向固定大小二维数组的指针
- amazon-web-services - 为什么我的 AWS Glue 爬网程序没有创建任何表?
- jwt - Bigcommerce:如何确保发送到我的系统的 JWT 令牌对用户来说是正确的
- nginx - Nginx 配置无效参数,即使它在文档中
- sql-server - 禁用 18-19 年的税收年终
- laravel - 下载的 laravel 项目在 localhost 上部署时挂在预加载器上
- c# - 返回重定向到另一个控制器的 ActionResult?
- python-2.7 - 向后使用 oauth2client 获取帐户名?
- c - C中for循环中的奇怪输出(重复数字)
- c# - 如何给SqlCommand添加参数?