我执行了以下查询:
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"。
答案 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}} ] }}