2013-05-29 92 views
1

我試圖根據標籤數量來獲取出版物列表。我已經得到了一些工作,但$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'" 

文件exemples:

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

任何想法?

+0

你能舉一個例子文件嗎? –

+0

當然:'{_id:'1',tags:['b','c']}','{_id:'2',tags:['a']}''{_id:'3'} ' – Hartator

+0

剛剛用例子編輯過這個問題,任何人都有線索?仍在努力... – Hartator

回答

2

您不能在$project流水線階段使用$push;它只適用於$group階段。不幸的是,你不能只在你的聚合管道中添加一個常量到所有標籤數組的末尾。

這是不雅,但我的佔位符添加到您的收藏本身中的所有變量數組:

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

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

然後在你的管道末端減去1從數

https://jira.mongodb.org/browse/SERVER-9334投票,以便將來獲得更好的方法。

+0

好吧,我已經投票了!當然,我們無法直接在聚合框架中實現它的恥辱似乎很窄,我們最終可以通過聚合框架實現。 – Hartator