mongodb没有表数据,为什么metadata返回null?

我使用下面代码执行分页查询,发现metadata[],不应该是返回metadata:[total: 0]吗,有谁知道不?

FacetOperation facet = Aggregation.facet(
                        count().as("total"),
                        Aggregation.addFields()
                                .addFieldWithValue("pageNum", pageNum+1)
                                .addFieldWithValue("pageSize", pageSize)
                                .build()

                ).as("metadata")
                .and(skip(pageSize * (pageNum - 1)),
                        limit(pageSize)).as("rows");
阅读 1.9k
1 个回答

问了chatgpt,下面是它的回答:

根据您提供的代码片段,聚合管道是使用MongoDB的聚合框架进行构建的。
在这个聚合管道中,可以看到facet操作用于创建一个包含两个输出文档(输出管道)的子级对象。第一个文档名为"metadata",它包含了另外两个管道操作:一个计算"total"并将其存储在键"total"下,并将其指定为名称为"metadata"的新文档中;另一个管道操作使用skip和limit操作符来实现分页查询。如果没有匹配的结果,则聚合管道的输出只是一个空数组[]。

因此,如果表中没有任何数据满足查询条件,那么"metadata"文档将是一个空的数组[],而不是[total:0],因为在没有任何数据时也会执行管道的所有聚合阶段,而不仅仅是count()聚合操作。

结合chatgpt的回答,和我自己的办法,下面是解决后的代码:

AggregationOperation project2 = project("rows")
                .and(ConditionalOperators.when(Criteria.where("metadata").is(null)).then(Collections.singletonList(0)).otherwise("$metadata.total"))
                .as("total")
                .and(ConditionalOperators.when(Criteria.where("metadata").is(null)).then(Collections.singletonList(pageNum+1)).otherwise("$metadata.pageNum"))
                .as("pageNum")
                .and(ConditionalOperators.when(Criteria.where("metadata").is(null)).then(Collections.singletonList(pageSize)).otherwise("$metadata.pageSize"))
                .as("pageSize")
                .andExclude("_id");
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进