使用$ project阶段

时间:2016-09-12 07:00:26

标签: mongodb mongodb-query aggregation-framework

目前,无法在$in数组聚合运算符中使用$filter运算符。

假设这是文档架构:

{
    _id: 1,
    users: [
        {
            _id: 'a',
            accounts: ['x', 'y', 'z']
        },
        {
            _id: 'b',
            accounts: ['j','k','l']
        }
    ]
}

我希望使用aggregate根据users数组的内容获取包含accounts过滤数组的文档。

IF $in适用于$filter运算符,我希望它看起来像这样:

db.test.aggregate([
    {
        $project: {
            'filtered_users': {
                $filter: {
                    input: '$users',
                    as: 'user',
                    cond: {
                        $in: ['$$user.accounts', ['x']]
                    }
                }
            }
        }
    }
])

并返回filtered_users仅第一位用户,因为 x 他的帐户。

但是,正如我所说,这不起作用,我得到了错误:

  

“无效的运算符'$ in'”

因为$filter运算符不支持。

现在我知道我可以使用$unwind并使用常规$match运算符来执行此操作,但随后需要使用$group来设置它会更长(并且更加丑陋)结果以数组形式返回 - 我不想要这个

我的问题是,如果有其他方法来操纵$filter运算符以获得我想要的结果。

2 个答案:

答案 0 :(得分:15)

由于数组的聚合操作不支持$in,因此您可以使用$setIsSubset。有关详细信息,请参阅this链接。聚合查询现在看起来像

db.test.aggregate([
{
    $project: {
        'filtered_users': {
            $filter: {
                input: '$users',
                as: 'user',
                cond: {
                   $setIsSubset: [['x'], '$$user.accounts']           
                }
            }
        }
    }
}])

此查询将仅返回[x]user.accounts作为数组子集的元素。

答案 1 :(得分:10)

从MongoDB 3.4开始,您可以在$in阶段使用$project聚合运算符

db.collection.aggregate([     
    {         
        "$project": {             
            "filtered_users": {                 
                "$filter": {                     
                    "input": "$users",                     
                    "as": "user",                     
                    "cond": { "$in": [ "x", "$$user.accounts" ] }                     
                }  
            }         
        }     
    } 
])