【问题标题】:How to connect Springboot to mongodb aggregation如何将 Spring Boot 连接到 mongodb 聚合
【发布时间】:2018-09-22 03:02:59
【问题描述】:

我想通过记录嵌套文档中有多少真、假和空来计算,我查看文档但无法理解

有了这个系列:

[
  {
    "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 - 肯定 - 否定 - nao_responderam

1 - 4 - 1 - 1

2 - 2 - 0 - 2

【问题讨论】:

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


    【解决方案1】:

    你真的在这里问了两个非常不同的问题:

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

    您可能会发现能回答 #1 的人比回答 #2 的人多。我还建议您以类似方式解决问题,首先让聚合在 mongo shell 中工作,然后将聚合管道编码到您的应用程序中。

    由于您有 2 个嵌套数组,因此您需要使用 $unwind 展开它们,以便您可以使用 $group 根据您的复合分组 idrespostas 进行计数。

    这样的事情应该可以工作:

    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}}
    ])
    

    我建议您运行该聚合,一次添加一个阶段,以更好地了解每个阶段在做什么。这样理解会更有意义。

    关于第二个问题,如何使用 Spring Boot(可能使用 Spring Data MongoDB)来做到这一点,有几种方法可以做到。 Spring Data MongoDB docs 将提供有关所提供的类似 fluent 的 API 的详细信息和示例。

    对于复杂聚合,您可能要考虑的一个“技巧”是将聚合编写为纯 JSON,然后对其进行解析。您甚至可以将其放入文件中并从文件中读取管道。这是一个基本示例:

        String stage1Json = "{$unwind:\"$destinatarios\"}";
        Document stage1 = Document.parse(stage1Json);
        List<Document> pipeline = new ArrayList<Document>();
        pipeline.add(stage1);
    
        AggregateIterable<Document> results = template.getDb().getCollection("foo").aggregate(pipeline);
        for (Document result : results) {
            System.out.println(result);
        }
    

    【讨论】:

      猜你喜欢
      • 2015-07-14
      • 2021-06-15
      • 2021-08-15
      • 1970-01-01
      • 1970-01-01
      • 2017-10-26
      • 2020-05-26
      • 2021-10-03
      • 2016-05-12
      相关资源
      最近更新 更多