我有一个集合名称Alpha_Num,它具有以下结构。我想找出哪个Alphabet-Numerals对会出现最多次数?
如果我们只使用下面的数据,对abcd-123出现两次,因此对efgh-10001对,但第二个不是我的有效案例,因为它出现在同一文件中。
{
"_id" : 12345,
"Alphabet" : "abcd",
"Numerals" : [
"123",
"456",
"2345"
]
}
{
"_id" : 123456,
"Alphabet" : "efgh",
"Numerals" : [
"10001",
"10001",
"1002"
]
}
{
"_id" : 123456567,
"Alphabet" : "abcd",
"Numerals" : [
"123"
]
}
我尝试使用聚合框架工作,如下所示
db.Alpha_Num.aggregate([
{"$unwind":"$Numerals"},
{"$group":
{"_id":{"Alpha":"$Alphabet","Num":"$Numerals"},
"count":{$sum:1}}
},
{"$sort":{"count":-1}}
])
此查询中的问题是它给两次efgh-10001对。 问题:如何在上述条件中从数组“数字”中选择不同的值?
答案 0 :(得分:23)
问题解决了。
db.Alpha_Num.aggregate([{
"$unwind": "$Numerals"
}, {
"$group": {
_id: {
"_id": "$_id",
"Alpha": "$Alphabet"
},
Num: {
$addToSet: "$Numerals"
}
}
}, {
"$unwind": "$Num"
}, {
"$group": {
_id: {
"Alplha": "$_id.Alpha",
"Num": "$Num"
},
count: {
"$sum": 1
}
}
}])
使用$ addToSet进行分组并再次展开就可以了。得到了10gen在线课程的答案。