如何使用 Java 中的 MongoDB 驱动程序使用累加器进行聚合查询

问题描述 投票:0回答:1

我对 MongoDB 及其与 Java 的交互还很陌生。 我正在使用这个驱动程序

<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>

我想执行这个聚合查询:

db.getCollection('COLLECTION').aggregate(
[
  {"$match": {"val.elem.0001": {"$exists":true}}},
  {"$project": {"FIELD_PATH": "$val.elem.0001"}},
  {$group: {_id:{"FIELD": {"$literal": "0001"}},
  "PATH": {"$addToSet": "$FIELD_PATH"}}}
]                                          
);

我编写的Java代码如下,但是我不确定我是否正确使用了

addToSet
方法:

AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
new Document("$match", new Document("val.elem.0001",new Document("$exists",true))),
new Document("$project", new Document("FIELD_PATH","$val.elem.0001")),
new Document("$group", new Document("_id",new Document("FIELD", new Document("$literal", "0001"))
    .append("PATH", Accumulators.addToSet("$PATH", "$FIELD_PATH"))))));

正确吗?因为如果添加“附加”部分,我无法在屏幕上打印结果。返回的错误是

Can't find a codec for class com.mongodb.client.model.BsonField

因此,总结并使我所要求的内容更具可读性和全面性:

  • 查询的 Java 表示形式是否正确?
  • 如果是这样,为什么我无法打印或访问查询结果?
java mongodb
1个回答
2
投票

您对API的使用不正确。

将聚合更改为以下聚合(坚持使用

Document
作为表达式)。

AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
       new Document("$match", new Document("val.elem.0001", new Document("$exists", true))),
       new Document("$project", new Document("FIELD_PATH", "$val.elem.0001")),
       new Document("$group", new Document("_id", new Document("FIELD", new Document("$literal", "0001"))).append("PATH", new Document("$addToSet", "$FIELD_PATH")))));

BsonField
是一个辅助类,主要是为
Accumulators
提供数据持有者,它返回
key
Bson
值对。因此它不适合用作值类型。当与辅助方法一起使用时,它会转换为
Document
并使用文档编解码器进行序列化。

您可以重新设计聚合以使用辅助方法(

Filters
Projections
Accumulators
Aggregates
)。

AggregateIterable<Document> output = collection.aggregate(Arrays.asList(
       Aggregates.match(Filters.exists("val.elem.0001")),
       Aggregates.project(Projections.computed("FIELD_PATH", "$val.elem.0001")),
       Aggregates.group( new Document("FIELD", new Document("$literal", "0001")), Accumulators.addToSet("PATH", "$FIELD_PATH"))));

您可以通过使用静态导入进一步简化聚合。

import static com.mongodb.client.model.Accumulators.addToSet;
import static com.mongodb.client.model.Aggregates.group;
import static com.mongodb.client.model.Aggregates.match;
import static com.mongodb.client.model.Aggregates.project;
import static com.mongodb.client.model.Projections.computed;
import static java.util.Arrays.*;

AggregateIterable<Document> output = collection.aggregate(asList(
       match(Filters.exists("val.elem.0001")),
       project(computed("FIELD_PATH", "$val.elem.0001")),
       group( new Document("FIELD", new Document("$literal", "0001")), addToSet("PATH", "$FIELD_PATH"))));

请参阅文档了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.