如何在 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"]}
]
}
}
}
]
所用聚合管道阶段的说明:
$match 在 name 上,因为您只需要特定 name 的结果
$unwind guests数组,以便我们在下一阶段对其成员进行聚合函数
$group by category 为了 $sum 客人总数和人数到场的客人
$cond/$eq 用于评估 arrived 并且仅添加到 guests_arrived 如果到达=真
$project 的主要目的是根据聚合值计算百分比,guests_arrived 和 guests_total,来自上一阶段
我想对此架构执行查询:
{
"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"]}
]
}
}
}
]
所用聚合管道阶段的说明:
$match 在 name 上,因为您只需要特定 name 的结果
$unwind guests数组,以便我们在下一阶段对其成员进行聚合函数
$group by category 为了 $sum 客人总数和人数到场的客人 $cond/$eq 用于评估 arrived 并且仅添加到 guests_arrived 如果到达=真
$project 的主要目的是根据聚合值计算百分比,guests_arrived 和 guests_total,来自上一阶段