gpt4 book ai didi

java - Morphia Complex Mongodb 聚合($substr、$project、$sort 等...)

转载 作者:行者123 更新时间:2023-12-02 03:00:14 28 4
gpt4 key购买 nike

我正在使用 Java 的 Morphia 库。

通过命令行客户端,我能够成功执行以下聚合

db.shows.aggregate([
{$project: {
_id: 1,
title: 1
}},
{$group:
{
_id: {titleLetter: {$substr: ["$title", 0, 1]}},
count: {$sum: 1},
shows: {$push: "$title"}
}
},
{$sort: {_id: 1}}
]);

这给了我一个按节目标题的第一个字母分组的节目列表。

上官方docs对于吗啡,我发现他们可以为 AdvancedDatastore.createQuery 采用 DBObject,但我没有看到任何类似的聚合内容。

也许我会使用类似的东西

BasicDBObject parse = (BasicDBObject) JSON.parse("{$group: { _id: {titleLetter: {$substr: [\"$title\", 0, 1]}}, count: {$sum: 1}, shows: {$push: \"$title\"} } }");

类似地还有BasicDBObjectBuilder方法

DBObject group = BasicDBObjectBuilder.start().push("$group")
.add("_id", "{titleLetter: {$substr: [\"$title\", 0, 1]}}")
.get();

所以我可以将 CLI 查询转换为 Morphia 的内容,或者至少将 import com.mongodb.*; 转换为 Java 可以理解的内容。

我无法使用任何方法从 Java 运行此查询。

我的问题是,将 cli 中的聚合查询转换为 Java 中的查询并最终返回 Java 对象的干净方法是什么?

最佳答案

创建 InputOutputMain 类,如下所示。

主类创建相当于 Cli 查询的 Morphia 并提供输入和输出类。

Morphia 负责验证 mongo 数据并将其映射到请求和响应。

输入类

package org.mongodb.morphia;
import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Entity;
import org.mongodb.morphia.annotations.Id;
import java.io.Serializable;

@Entity("Input")
public class Input implements Serializable {
@Id
private ObjectId id;
private String title;
//Getters and Setters
}

输出类

package org.mongodb.morphia;
import java.util.List;
public class Output {
private int count;
private List<String> shows;
//Getters and Setters
}

主类

package org.mongodb.morphia;
import com.mongodb.MongoClient;
import org.mongodb.morphia.aggregation.AggregationPipeline;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import static org.mongodb.morphia.aggregation.Accumulator.accumulator;
import static org.mongodb.morphia.aggregation.Group.*;
import static org.mongodb.morphia.aggregation.Projection.projection;
import static org.mongodb.morphia.query.Sort.descending;

public class MorphiaClient {
public static void main(String[] args) {
final Morphia morphia = new Morphia();
morphia.mapPackage("org.mongodb.morphia");
final Datastore datastore = morphia.createDatastore(new MongoClient(), "test");
AggregationPipeline pipeline = datastore.createAggregation(Input.class).
project(projection("id"), projection("title")).
group(id(grouping("titleLetter", accumulator("$substr", Arrays.asList("$title", 0, 1)))),
grouping("count", accumulator("$sum", 1)),
grouping("shows", accumulator("$push", "title"))).
sort(descending("id"));
List<Output> results = new ArrayList<>();
Iterator<Output> iterator = pipeline.aggregate(Output.class);
while (iterator.hasNext()) {
results.add(iterator.next());
}
}
}

关于java - Morphia Complex Mongodb 聚合($substr、$project、$sort 等...),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42462992/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com