MongoDB数组中非匹配值的百分比

时间:2016-02-17 15:32:38

标签: node.js mongodb

我有一个包含值的对象的数组,例如:

[{
  item: '123A',
  meta: {}
},
{
  item: '123A',
  meta: {}
},
{
  item: '123B',
  meta: {}
}
,{
  item: '123A',
  meta: {}
}]

我想知道是否有办法可以查询相同匹配项目的百分比最高百分比。

例如,在这种情况下,最高匹配项为123A,因此我希望返回此项目在数组中找到的百分比,即0.75

我希望能够对此进行查询,因此我最终可以按最低百分比或最高百分比进行排序。

我认为必须有一种聚合方式,但我真的不确定。

任何建议都很棒。

1 个答案:

答案 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 }