按聚合mongodb中的文档数组排序

时间:2014-10-25 13:49:20

标签: mongodb mongodb-query aggregation-framework

我有一个包含这些文件的集合

{
   "Day" : 1
   "Name" : "Fred",
   "Badges" : ["STAR", "FAST"]
}

{
   "Day" : 2
   "Name" : "Fred",
   "Badges" : ["STAR", "NEWBIE", "SLOW"]
}

{
   "Day" : 3
   "Name" : "Fred",
   "Badges" : ["STAR", "NEWBIE", "FAST"]
}


{
   "Day" : 1
   "Name" : "Frank",
   "Badges" : ["STAR","GO"]
}

{
   "Day" : 2
   "Name" : "Frank",
   "Badges" : ["STAR"]
}

为了返回像这样的统计数据,我整合了这些文件

{
  Name : "Fred"
  Badges : [{Name : "STAR", Count : 3}, 
            {Name : "NEWBIE", Count : 2}, 
            {Name : "FAST", Count : 2},
            {Name : "SLOW", Count : 1}
           ]
}

和弗兰克一样。

{
  Name : "Fred"
  Badges : [{Name : "STAR", Count : 2}, 
            {Name : "GO", Count : 1}
           ]
}

我的排序有问题。 如何订购徽章价值STAR? 我可以更改聚合查询以产生不同的结果吗?

我认为像这样的结构可以是一个很好的解决方案,但我不明白如何获得它

 {Name : "Fred"
   STAR : 2
   GO : 1}

由于

1 个答案:

答案 0 :(得分:1)

db.a.aggregate([
{$unwind: "$Badges"}, 
{$group: {_id: {name: "$Name", badge: "$Badges"}, numberOfBadges: { $sum: 1}}},
{$project: {_id: 0,name: "$_id.name", badge: "$_id.badge", numberOfBadges:1, orderField:  {$cond: [{$eq: ["$_id.badge", "STAR"]}, "$numberOfBadges", 0]}}}, 
{$sort: {orderField:-1}}])

据我所知,您不能在聚合框架中拥有动态字段名称,因此您不能将字段名称设为STAR。但是,您可以通过向文档中添加新字段(例如orderField)来制作技巧,如果徽章为numberOfBadges则设置STAR到该文档的数量,否则将0设置为该字段。然后按orderField排序。