我在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"))))));
这是对的吗?因为如果我添加&#34;追加&#34;我无法在屏幕上打印结果部分。返回的错误是 找不到类com.mongodb.client.model.BsonField的编解码器
所以,要恢复并使我更加可读和全面的问题:
在此先感谢,如果您需要更多信息,我已准备好提供这些信息。
答案 0 :(得分: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
&amp; 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"))));
了解更多信息
http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/aggregation/