MongoDB聚合:使用$cond检查数组字段中的值
我有一个数组值的用户集合!状态属性 我可以很容易地找到锁定的用户MongoDB聚合:使用$cond检查数组字段中的值,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一个数组值的用户集合!状态属性 我可以很容易地找到锁定的用户 db.users.find({'state' : 'locked'}) 因为条件会查看状态数组 然而,我需要在聚合框架的上下文中使用它,而在那里我无法让它工作。以下是我的一个非工作尝试: db.users.aggregate({ '$group' : { '_id' : { '$cond' : [{'$eq' : ['$state', 'locked']}, 'locked
db.users.find({'state' : 'locked'})
因为条件会查看状态数组
然而,我需要在聚合框架的上下文中使用它,而在那里我无法让它工作。以下是我的一个非工作尝试:
db.users.aggregate({
'$group' : {
'_id' : { '$cond' : [{'$eq' : ['$state', 'locked']},
'locked',
'not_locked']
},
'count' : { '$sum' : 1 }
}
})
现在,我想根据状态数组中的元素生成一个组id。我假设您想为每个可能的状态元素生成一个文档,并计算每个组中具有状态的原始文档数 您可以通过首先执行$unwind来拆分文档/状态组合来完成此操作。然后将各州分组
如果可以复制这些状态,那么展开、组id/状态、组状态+计数可能会有点麻烦自v.3.2以来,有一种简单的方法
...aggregate([
{
$addFields: {
arrayFilter: {
$filter: {
input: '$someArray',
as: 'item',
cond: ['$$item', 'locked']
}
}
}
},
{
$unwind: '$arrayFilter'
},
{
$project: {
arrayFilter: 0
}
}
]);
添加按“锁定”筛选的字段
$unwind在结果数组管道上删除空数组的结果
可选通过项目从结果中删除筛选器字段