mongodb - 如何优化聚合查询以根据不同的键进行分组?
问题描述
我的 mongoDB 文档如下所示:
[
{
"fields": {
"field_1": {
"name": "f1",
"first": {
"check": true
}
},
"field_2": {
"name": "f2",
"second": {
"check": true
}
},
"field_3": {},
"field_4": {
"name": "f4",
"second": {
"check": true
}
}
}
},
{
"fields": {
"field_1": {
"name": "f1",
"second": {
"check": false
}
},
"field_2": {
"name": "f2",
"second": {
"check": true
},
"first": {
"check": true
}
},
"field_3": {
"name": "f3",
"second": {
"check": true
}
}
}
}
]
预期输出:
创建父组 f1(
fields.field1.name
) 和 f2(fields.field2.name
)他们每个人都有两个子组,这些子组根据以下条件显示与其父组相关的指标:
- first_group:文档数
first.check=true
- second_group:
first.check
不存在的文档数量和second.check=true
- first_group:文档数
结果:
[
{
"data": [
{
"_id": "f1",
"values": [
{
"second_group": 0,
"first_group": 1
}
]
},
{
"_id": "f2",
"values": [
{
"second_group": 1,
"first_group": 1
}
]
}
]
}
]
我已经使用 $facet 生成了查询,但我不满意,因为我必须在每个父组中重复我的子级分组逻辑(我在 $facet 中有 4 个数组)
请告诉我如何删除重复查询。有没有其他方法可以实现这个用例?
谢谢!
解决方案
发布适用于给定条件和预期 O/p 的聚合查询:
db.collection.aggregate([
{
$unwind: "$fields",
},
{
$project: {
data: {
$objectToArray: "$fields",
},
},
},
{
$unwind: "$data",
},
{
$match: {
"data.v.first.check": true,
},
},
{
$group: {
_id: "$data.v.name",
values: {
$push: {
first_group: {
$sum: {
$cond: [
{
$eq: ["$data.v.first.check", true],
},
1,
0,
],
},
},
second_group: {
$sum: {
$cond: [
{
$eq: ["$data.v.second.check", true],
},
1,
0,
],
},
},
},
},
},
},
]);
推荐阅读
- rust - 是使用 drain(..) 来保留原始结构的内存分配的唯一原因吗?
- javascript - 从动态图表对象保存文本框值
- c - 除了 c 中的空终止符之外,字符 a 和字符串 a 的存储方式如何不同?
- python - django中的IntegrityError主键无效
- java - 为什么这个for循环只运行一次?
- android - 如何检查文件路径是否指向android中的内部存储器(或)sd卡?
- javascript - 如何在 JavaScript 中循环
- python - 程序的计算步骤、实现和注释是什么?
- javascript - 过度使用 Object.prototype.toString.call?
- java - 我在 Java 中使用带有扫描仪语句的 while 循环、if_else 和 try_catch 并卡住了。我是初学者,因此对发现错误感到困惑