在组聚合中转换为小写

时间:2014-03-21 13:39:55

标签: mongodb

我想要返回博客帖子标记及其总计数的汇总。我的博客文章存储如下:

{
    "_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
} 

我是否需要另一个投影来添加小写标记?

3 个答案:

答案 0 :(得分:3)

是的,您必须将其添加到投影中。它不适用于群组,只有$sumhttp://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