我有一个包含值的对象的数组,例如:
[{
item: '123A',
meta: {}
},
{
item: '123A',
meta: {}
},
{
item: '123B',
meta: {}
}
,{
item: '123A',
meta: {}
}]
我想知道是否有办法可以查询相同匹配项目的百分比最高百分比。
例如,在这种情况下,最高匹配项为123A
,因此我希望返回此项目在数组中找到的百分比,即0.75
。
我希望能够对此进行查询,因此我最终可以按最低百分比或最高百分比进行排序。
我认为必须有一种聚合方式,但我真的不确定。
任何建议都很棒。
答案 0 :(得分:6)
可以进行汇总,但您需要在 $unwind
步骤之前添加 $group
运算符,以规范化/压平数组,以便您可以使用 $group
运算符执行必要的聚合。
考虑以下聚合操作,它将为您提供最终结果中的百分比计算,这假设您的文档具有最小的模式示例:
{
_id: 1,
arr: [
{ item: '123A', meta: {} },
{ item: '123A', meta: {} },
{ item: '123B', meta: {} },
{ item: '123A', meta: {} }
]
}
运行管道
var pipeline = [
{
"$project": {
"arr": 1,
"arrSize": { "$size": "$arr" }
}
},
{ "$unwind": "$arr" },
{
"$group": {
"_id": "$arr.item",
"count": { "$sum": 1 },
"total": { "$first": "$arrSize" }
}
},
{
"$project": {
"item": "$_id",
"_id": 0,
"percentage":{
"$multiply": [
{ "$divide": [ 100, "$total" ] }, "$count"
]
}
}
}
];
db.test.aggregate(pipeline);
示例输出
{ "item" : "123A", "percentage" : 75 }
{ "item" : "123B", "percentage" : 25 }