Java 如何在morphia中执行聚合?
我有一个对象的Java 如何在morphia中执行聚合?,java,mongodb,aggregation-framework,morphia,Java,Mongodb,Aggregation Framework,Morphia,我有一个对象的列表,我需要在Morphia中执行查询,以从给定对象的字符串的另一个嵌入列表中获得唯一的结果 对象类: 聚合的结果应该是: [A,C,B,D,E,F,L,M,N] 输出是排序的形式。我如何在morphia中实现这一点?我试图搜索官方文件,但找不到暗示 任何帮助或暗示都是可贵的。谢谢 编辑-1 结果列表中的数据不可用,我需要在结果列表(签出JSON格式)本身上应用聚合。您可以使用下面的代码使用聚合管道获取唯一的和排序类别 准备查询筛选器: Query<Fruits> q
列表
,我需要在Morphia
中执行查询,以从给定对象的字符串
的另一个嵌入列表
中获得唯一的结果
对象类:
聚合的结果应该是:
[A,C,B,D,E,F,L,M,N]
输出是排序的形式。我如何在morphia中实现这一点?我试图搜索官方文件,但找不到暗示
任何帮助或暗示都是可贵的。谢谢
编辑-1
结果列表
中的数据不可用,我需要在结果列表
(签出JSON格式)本身上应用聚合
。您可以使用下面的代码使用聚合管道获取唯一的和排序类别
准备查询筛选器:
Query<Fruits> query = datastore.createQuery(Fruits.class);
Iterator<Fruits> fruitIterator = fruitList .iterator();
CriteriaContainer orQuery = query.or();
while(fruitIterator.hasNext()) {
Fruits fruit = fruitIterator.next();
orQuery.add(query.and(query.criteria("id").equal(fruit.getId()), query.criteria("categories").equal(fruit.getCategories())));
}
更新:
Mongo Shell查询
[{ "$match" : { "$or" : [ { "$and" : [ { "_id" : 1234566} , { "categories" : [ "A" , "B" , "C" , "D"]}]} , { "$and" : [ { "_id" : 32434} , { "categories" : [ "A" , "C" , "E" , "F"]}]} , { "$and" : [ { "_id" : 32434} , { "categories" : [ "A" , "L" , "M" , "N"]}]}]}}, { "$unwind" : "$categories"}, { "$group" : { "_id" : { "categories" : "$categories"}}}, { "$sort" : { "_id.categories" : 1}}, { "$project" : { "_id" : 0 , "category" : "$_id.categories"}}]
谢谢你的回答
\u id
这里指的是水果.id
。对吧?不客气。否是从组生成的\u id
。Mongo shell查询是为了比较而添加的&在文章中也添加了一些解释。我试图实现这段代码,但对上面代码中的Fruit
对象数据在哪里以及如何使用感到困惑。你能帮帮我吗?我的意思是如何在上面的Json上应用这个聚合查询?Morphia需要水果对象来收集注释定义的元数据。其中一个示例是从@Entity
注释(如果您定义了注释)中读取集合名称。这里有更多的信息,你有其他的设置吗?你不能运行查询吗?啊!我想我误解你了。请查看问题部分的Edit-1
。
List<Fruits> fruitList = fruitControllerDao.search(fruitList);
List<Category> categories = new ArrayList<>();
datastore.createAggregation(Fruits.class)
.unwind("categories")
.group(Group.id(Group.grouping("categories")))
.sort(Sort.ascending("_id.categories"))
.project(Projection.projection("_id").suppress(),
Projection.projection("categories", "_id.categories"))
.aggregate(Category.class).forEachRemaining(categories::add);
class Category {
private String category;
}
Query<Fruits> query = datastore.createQuery(Fruits.class);
Iterator<Fruits> fruitIterator = fruitList .iterator();
CriteriaContainer orQuery = query.or();
while(fruitIterator.hasNext()) {
Fruits fruit = fruitIterator.next();
orQuery.add(query.and(query.criteria("id").equal(fruit.getId()), query.criteria("categories").equal(fruit.getCategories())));
}
List<Category> categories = new ArrayList<>();
datastore.createAggregation(Fruits.class)
.match(query)
.unwind("categories")
.group(Group.id(Group.grouping("categories")))
.sort(Sort.ascending("_id.categories"))
.project(Projection.projection("_id").suppress(), Projection.projection("category", "_id.categories"))
.aggregate(Category.class).forEachRemaining(categories::add);
class Category {
private String category;
}
[{ "$match" : { "$or" : [ { "$and" : [ { "_id" : 1234566} , { "categories" : [ "A" , "B" , "C" , "D"]}]} , { "$and" : [ { "_id" : 32434} , { "categories" : [ "A" , "C" , "E" , "F"]}]} , { "$and" : [ { "_id" : 32434} , { "categories" : [ "A" , "L" , "M" , "N"]}]}]}}, { "$unwind" : "$categories"}, { "$group" : { "_id" : { "categories" : "$categories"}}}, { "$sort" : { "_id.categories" : 1}}, { "$project" : { "_id" : 0 , "category" : "$_id.categories"}}]