我想要返回博客帖子标记及其总计数的汇总。我的博客文章存储如下:
{
"_id" : ObjectId("532c323bb07ab5aace243c8e"),
"title" : "Fitframe.js - Responsive iframes made easy",
"tags" : [
"JavaScript",
"jQuery",
"RWD"
]
}
然后我执行以下管道:
printjson(db.posts.aggregate(
{
$project: {
tags: 1,
count: { $add: 1 }
}
},
{
$unwind: '$tags'
},
{
$group: {
_id: '$tags',
count: {
$sum: '$count'
},
tags_lower: { $toLower: '$tags' }
}
},
{
$sort: {
_id: 1
}
}
));
为了正确排序结果,我需要对每个标记的小写版本进行排序。但是,执行上面的代码时,我收到以下错误:
aggregate failed: {
"errmsg" : "exception: unknown group operator '$toLower'",
"code" : 15952,
"ok" : 0
}
我是否需要另一个投影来添加小写标记?
答案 0 :(得分:3)
是的,您必须将其添加到投影中。它不适用于群组,只有$sum
(http://docs.mongodb.org/manual/reference/operator/aggregation-group/)等特定运营商才会被视为$ group运营商,并且能够在群组的该级别上使用
答案 1 :(得分:2)
您不需要添加其他投影...您可以在执行$group
时修复它:
db.posts.aggregate(
{
$project: {
tags: 1,
count: { $add: 1 }
}
},
{
$unwind: '$tags'
},
{
$group: {
_id: { tag: '$tags', lower: { $toLower : '$tags' } },
count: {
$sum: '$count'
}
}
},
{
$sort: {
"_id.lower": 1
}
}
)
在上面的示例中,我保留了原始名称,并将小写版本添加到_id
。
答案 2 :(得分:1)
在$unwind
和$grop
之间添加另一个投影步骤:
...
{$project: {
tags: {$toLower: '$tags'},
count: 1
}}
...
从tags_lower
$group