我有一个包含这些文件的集合
{
"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}
由于
答案 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
排序。