1

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

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

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

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

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

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

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

4

2 回答 2

0

我假设您想要每个可能的状态元素的文档,并在每个组中计算您的原始文档,它们有一个状态......

您可以通过首先执行 $unwind 来拆分文档/状态组合来做到这一点。然后将这些状态组合在一起。

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

于 2013-11-20T15:26:30.640 回答
0

从 v.3.2 开始有一个简单的方法

...aggregate([
      {
        $addFields: {
          arrayFilter: {
            $filter: {
              input: '$someArray',
              as: 'item',
              cond: ['$$item', 'locked']
            }
          }
        }
      },
      {
        $unwind: '$arrayFilter'
      },
      {
        $project: {
          arrayFilter: 0
        }
      }
    ]);
  1. 添加按“锁定”过滤的字段
  2. $unwind 在结果数组上(删除空数组的管道结果)
  3. (可选)通过项目从结果中删除过滤器字段
于 2019-07-18T12:32:02.090 回答