我想通过记录来计数嵌套文档中有多少真,假和空值,我查看文档但不理解
使用此收藏集:
[
{
"id": "1",
"day": "2019-01-01",
"destinatarios": [
{
"id": 1,
"leitura": "2019-01-01",
"respostas": [
{
"positiva": true
},
{
"positiva": true
}
]
},
{
"id": 2,
"leitura": "2019-01-01",
"respostas": [
{
"positiva": true
},
{
"positiva": false
}
]
},
{
"id": 3,
"leitura": null,
"respostas": []
},
{
"id": 1,
"leitura": "2018-01-01",
"respostas": [
{
"positiva": false
}
]
}
]
},
{
"id": "2",
"day": "2019-01-01",
"destinatarios": [
{
"id": 1,
"leitura": "2019-01-01",
"respostas": [
{
"positiva": true
}
]
},
{
"id": 2,
"leitura": "2019-01-01",
"respostas": [
{
"positiva": true
}
]
},
{
"id": 3,
"leitura": null,
"respostas": [
]
},
{
"id": 1,
"leitura":null,
"respostas": [
]
}
]
}
]
可以创建此退货:
Id-positivos-negativos-nao_responderam
1-4-1-1
2-2-0-2
答案 0 :(得分:0)
您实际上是在问两个非常不同的问题:
您可能会发现能够回答#1的人多于#2。我还建议您以类似的方式处理该问题,以使聚合首先在mongo shell中运行,然后将聚合管道编入应用程序。
由于您有2个嵌套数组,因此需要使用$unwind来展开它们,以便可以使用$group来基于id
和{{ 1}}。
类似的事情应该起作用:
respostas
我建议您运行该聚合一次添加一个阶段,以更好地了解每个阶段的工作。以这种方式理解它会更有意义。
关于如何使用Spring Boot(可能使用Spring Data MongoDB)执行此操作的第二个问题,有几种方法可以完成。 Spring Data MongoDB docs将提供有关所提供的流利API的详细信息和示例。
对于复杂的聚合,您可能要考虑的一个“技巧”是将聚合写为纯JSON,然后对其进行解析。您甚至可以将其放入文件中,然后从文件中读取管道。这是一个基本示例:
db.foo.aggregate([
{$unwind:"$destinatarios"},
{$unwind:{path:"$destinatarios.respostas", preserveNullAndEmptyArrays:true}},
{$project:{_id:0,id:1,resp:{$ifNull:["$destinatarios.respostas.positiva", "null"]}}},
{$group: {_id:{id:"$id", resp:"$resp"}, count: { $sum: 1 }}},
{$sort:{"_id.id":1}},
{$project:{_id:0,id:"$_id.id",resp:"$_id.resp",count:1}}
])