按字符串长度过滤聚合

时间:2017-11-13 17:43:07

标签: mongodb mongodb-query aggregation-framework

我执行了以下查询:

db.Indiv2.aggregate(
{$unwind: '$conso'},
{$group: {_id: {conso:'$conso.nom_commercial', region:"$region"}, sum: 
{$sum: 1}}},
{$sort : {sum : -1}},
{$group: {
_id: "$_id.region",
"conso": {
    $first: "$_id.conso"
},
"sum": {
    $first: "$sum"
},
}},
{$sort : {_id : 1}}
);

按地区以下列格式返回消费最多的食物:

    {
        "_id" : {
            "conso" : "x",
            "region" : 1
        },
        "sum" : 73226.0
    },
    {
        "_id" : {
            "conso" : "x",
            "region" : 8
        },
        "sum" : 25683.0
    },
    {
        "_id" : {
            "conso" : "grandlait demi �cr�m� uht",
            "region" : 1
        },
        "sum" : 251.0
    }

然而,很多食物都没有名字。这些物品名为" x" (上面的例子)。我想过滤我的查询以排除这些项目。我正在寻找一个等效的过滤器,可以过滤长度低于2个字符的字符串或过滤字符串" x"。

2 个答案:

答案 0 :(得分:2)

这里有一个$redact运算符可能会有所帮助:

尝试:

db.collection.aggregate([
    //previous aggregations
    {
        "$redact": {
            "$cond": [
                { "$gt": [ { "$strLenCP": "$_id.conso" }, 2] },
                "$$KEEP",
                "$$PRUNE"
            ]
        }
    }
])

答案 1 :(得分:0)

您可以捕获conso长度并过滤。鉴于上述情况或条件,我们最终得到:

// previous pipeline here, then:
{$addFields: {slen: {$strLenBytes: "$_id.conso"}}}
,{$match: {$or: [ {"_id.conso": {$ne: "x"}}, {slen: {$gt: 1}} ] }}