【问题标题】:Aggregation Framework, Sort by array size including empty聚合框架,按数组大小排序,包括空
【发布时间】:2013-05-29 13:29:18
【问题描述】:

我正在尝试获取按标签数量排序的出版物列表。我已经完成了一些工作,但是 $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' }

有什么想法吗?

【问题讨论】:

  • 你能展示一两个示例文档吗?
  • 当然:{_id: '1', tags: ['b','c']}, {_id: '2', tags: ['a']} {_id: '3'}
  • 刚刚用示例编辑了问题,有人知道吗?还在努力……

标签: mongodb mongoid mongodb-query aggregation-framework


【解决方案1】:

您不能在$project 管道阶段使用$push;它仅适用于$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,以后有更好的方法。

【讨论】:

  • 好的,我已经投票了!当然,遗憾的是我们不能直接在聚合框架中完成,我们最终可以通过聚合框架实现的目标似乎非常狭窄。
猜你喜欢
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2014-11-17
  • 2021-02-21
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
相关资源
最近更新 更多