聚合框架,按数组大小排序,包括空

时间:2013-05-29 13:29:18

标签: mongodb mongoid mongodb-query aggregation-framework

我试图获取按标签数量排序的出版物列表。我得到了一些工作但$unwind运算符使零标记的出版物消失了。我试图添加一个占位符来绕过它而没有成功:

Publication.collection.aggregate(
    { "$project" => { tags: { "$push" => "holder" } } }, 
    { "$unwind" => '$tags' }, 
    { "$group" => { _id: '$_id', count: { "$sum" => 1 } } }, 
    { "$sort" => { count: 1 } }
  )

我得到了:

failed with error 15999: "exception: invalid operator '$push'"

文件例子:

{ _id: '1', tags: ['b','c'] } 
{ _id: '2', tags: ['a'] } 
{ _id: '3' }

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您无法在$push管道阶段使用$project;它只适用于$group阶段。不幸的是,您不能只在汇总管道中的所有标签数组的末尾添加常量。

这是不优雅的,但我会在你的集合中为所有标签数组添加一个占位符:

db.collection.update({}, {$addToSet: {tags: null}}, false, true)

然后从管道末端的计数中减去1:

db.collection.aggregate(
    { '$unwind' : '$tags' },
    { '$group' : { _id: '$_id', count: { '$sum' : 1 } } },
    { $project: { _id: true, count: { '$subtract': [ '$count', 1 ] } } },
    { '$sort' : { count: 1 } }
)

投票https://jira.mongodb.org/browse/SERVER-9334以便在将来获得更好的方法。