如何将Springboot连接到mongodb聚合

时间:2018-09-22 03:03:00

标签: mongodb spring-boot spring-data-mongodb

我想通过记录来计数嵌套文档中有多少真,假和空值,我查看文档但不理解

使用此收藏集:

[
  {
    "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

1 个答案:

答案 0 :(得分:0)

您实际上是在问两个非常不同的问题:

  1. 如何编写此聚合查询
  2. 如何使用Spring Boot表示/运行聚合

您可能会发现能够回答#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}}
])