2017-04-25 86 views
1

我有一個List的對象,我需要在Morphia中執行查詢,以獲得String在給定對象中的另一個嵌入List的唯一結果。如何在嗎啡中進行聚合?

對象類:

@Entity 
public class Fruits { 
    @NotNull private Long id; 
    @NotNull private List<String> categories; 
} 

數據JSON格式:

水果:

{[ 
    "id": 1234566, 
    "categories": ["A", "B", "C", "D"] 
], 
[ 
    "id": 32434, 
    "categories": ["A", "C", "E", "F"] 
], 
[ 
    "id": 32434, 
    "categories": ["A", "L", "M", "N"] 
] 
} 

聚合的應該是其結果是:

[A,C,B,D,E,F,L,M,N] 

的輸出是以排序的形式。我如何在嗎啡中實現這一點?我試圖搜索官方文檔,但無法找到提示。

任何幫助或提示將是可觀的。由於

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); 

,我已經在fruitList創建

class Category { 
    private String category; 
} 

數據是不可用的,我需要在fruitList申請aggregation(簽出JSON格式)本身。

回答

1

您可以使用下面的代碼使用聚合管道獲取唯一的&排序類別。

準備查詢過濾器:

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()))); 
} 

上查詢過濾器的下面的查詢$matches$unwindscategories隨後$group以便移除重複和排序。最後一步是將分組階段的值和$project中的值讀入類別字段。

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"}}] 
+0

謝謝您的回答。 '_id'在這裏指'Fruits.id'。對? –

+0

不客氣。沒有它從'group'生成的'_id'。添加了Mongo shell查詢用於比較,並在帖子中添加了一些解釋。 – Veeram

+0

我想實現這個代碼,但是對於在哪裏以及如何在上面的代碼中使用'Fruit'對象數據感到困惑。你能幫我出來嗎?我的意思是如何在上面的Json上應用這個聚合查詢? –

相關問題