如何在 MongoDB 中执行复杂查询

How to perform a complex query in MongoDB

我想对此架构执行查询:

{ 
   "name" : "xxx",
   "guests" : [ 
       {
            "category" : "category 1",
            "arrived" : false
       },
       {
            "category" : "category 2",
            "arrived" : false
       },
       {
            "category" : "category 1",
            "arrived" : true
       },
       {
            "category" : "category 2",
            "arrived" : true
       }
   ]
}

我想为某个名字获取一个列表,其中包含每个类别的客人到达百分比。

以上文件为例,我要接收:

{
    name : "xxx",
    results : [
         {
              category : "category 1",
              arrived : 50 (percent)
         },
         {
              category : "category 2",
              arrived : 50 (percent)
         },
    ]

有没有办法通过单个 MongoDB 查询来完成此操作?另外,我应该在客户端还是服务器端进行此计算?

您可以使用聚合。这是一个例子:

[
    {
        $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"]}
                ]

            }
        }
    }
]

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

$matchname 上,因为您只需要特定 name 的结果

$unwind guests数组,以便我们在下一阶段对其成员进行聚合函数

$group by category 为了 $sum 客人总数和人数到场的客人 $cond/$eq 用于评估 arrived 并且仅添加到 guests_arrived 如果到达=真

$project 的主要目的是根据聚合值计算百分比,guests_arrivedguests_total,来自上一阶段