首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合框架,按数组大小排序,包括空

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

Stack Overflow用户
提问于 2013-05-29 21:29:18
回答 1查看 971关注 0票数 1

我正在尝试获取按标签数量排序的出版物列表。我已经做了一些工作,但是$unwind操作符使没有标记的出版物消失。我试图添加一个占位符来绕过它,但没有成功:

代码语言:javascript
复制
Publication.collection.aggregate(
    { "$project" => { tags: { "$push" => "holder" } } }, 
    { "$unwind" => '$tags' }, 
    { "$group" => { _id: '$_id', count: { "$sum" => 1 } } }, 
    { "$sort" => { count: 1 } }
  )

我得到了:

代码语言:javascript
复制
failed with error 15999: "exception: invalid operator '$push'"

文档示例:

代码语言:javascript
复制
{ _id: '1', tags: ['b','c'] } 
{ _id: '2', tags: ['a'] } 
{ _id: '3' }

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-31 01:10:37

不能在$project管道阶段使用$push;它只能用于$group阶段。不幸的是,您不能只是在聚合管道中的所有标记数组的末尾添加一个常量。

这很不雅观,但我会在集合本身的所有标记数组中添加一个占位符:

代码语言:javascript
复制
db.collection.update({}, {$addToSet: {tags: null}}, false, true)

然后从流水线末尾的计数中减去1:

代码语言:javascript
复制
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,让它在未来获得更好的方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16815251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档