Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MongoDB聚合:使用$cond检查数组字段中的值_Mongodb_Aggregation Framework - Fatal编程技术网

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在结果数组管道上删除空数组的结果 可选通过项目从结果中删除筛选器字段