如何在MongoDB中执行复杂查询

1 mongodb aggregation-framework mongodb-aggregation

我想对此架构执行查询:

{ 
   "name" : "xxx",
   "guests" : [ 
       {
            "category" : "category 1",
            "arrived" : false
       },
       {
            "category" : "category 2",
            "arrived" : false
       },
       {
            "category" : "category 1",
            "arrived" : true
       },
       {
            "category" : "category 2",
            "arrived" : true
       }
   ]
}
Run Code Online (Sandbox Code Playgroud)

我想得到一个特定的名字,一个列表,列出每个类别的客人百分比.

对于上面的文档作为示例,我想收到:

{
    name : "xxx",
    results : [
         {
              category : "category 1",
              arrived : 50 (percent)
         },
         {
              category : "category 2",
              arrived : 50 (percent)
         },
    ]
Run Code Online (Sandbox Code Playgroud)

有没有办法用一个MongoDB查询来做到这一点?另外,我应该在客户端还是服务器端进行此计算?

Wak*_*ake 5

你可以使用聚合.这是一个例子:

[
    {
        $match: {name:"xxx"}
    },
    {
        $unwind: "$guests"
    },
    {
        $group: {
            _id:"$guests.category",
            guests_arrived: {
                $sum: { $cond: [ {$eq:["$guests.arrived",true]}, 1, 0 ] }
            },
            guests_total: {
                $sum: 1
            }
        }
    },
    {
        $project:{
            _id: false,
            category: "$_id",
            guests_arrived:true,
            guests_total:true,
            "percent": {
                $multiply: [
                    100,
                    {$divide: ["$guests_arrived","$guests_total"]}
                ]

            }
        }
    }
]
Run Code Online (Sandbox Code Playgroud)

使用的聚合管道阶段的说明:

$匹配 on name,因为您只需要特定名称的结果

$放松客人阵列,使我们可以在下一阶段对其成员进行聚合函数

类别分组$以便$ sum总计客人和已到达的客人数量 $ cond/$ eq用于评估到达并且仅在到达时添加到guests_arrived = true

$项目与计算基于聚合值百分比的主要目的,guests_arrivedguests_total,从前一阶段