MongoDB聚合:使用$ cond检查数组字段中的值

时间:2013-11-14 13:07:12

标签: mongodb aggregation-framework

我有一组具有数组值(!)状态属性的用户。

我可以轻松找到锁定的用户

db.users.find({'state' : 'locked'})

因为条件“调查”状态数组。

但是,我需要在聚合框架的上下文中,我无法让它工作。这是我的一次非工作尝试:

db.users.aggregate({
  '$group' : {
    '_id' : { '$cond' : [{'$eq' : ['$state', 'locked']},
                      'locked',
                      'not_locked'] 
    },
    'count' : { '$sum' : 1 }
    }
})

IOW,我想根据状态数组中的元素存在生成一个组_id。

2 个答案:

答案 0 :(得分:0)

我假设你想要一份关于状态的每个可能元素的文档,并计算他们拥有状态的每个组中的原始文档......

您可以先执行$ unwind来拆分文档/状态组合。然后将州合并在一起。

如果状态可以重复,则可能有点棘手(展开,组ID /状态,组状态+计数)

答案 1 :(得分:0)

从3.2版开始,有一种简单的方法

...aggregate([
      {
        $addFields: {
          arrayFilter: {
            $filter: {
              input: '$someArray',
              as: 'item',
              cond: ['$$item', 'locked']
            }
          }
        }
      },
      {
        $unwind: '$arrayFilter'
      },
      {
        $project: {
          arrayFilter: 0
        }
      }
    ]);
  1. 添加由“锁定”过滤的字段
  2. 在结果数组上展开$ unwind(删除具有空数组的管道结果)
  3. (可选)通过项目从结果中删除过滤器字段