2016-02-04 43 views
1

我在Morphia创建聚合时遇到了问题,documentation真的不清楚。这是原始查询:Mongorphb Morphia聚合

db.collection('events').aggregate([ 
    { 
    $match: { 
     "identifier": { 
     $in: [ 
      userId1, userId2 
     ] 
     }, 
     $or: [ 
     { 
      "info.name": "messageType", 
      "info.value": "Push", 
      "timestamp": { 
      $gte: newDate("2015-04-27T19:53:13.912Z"), 
      $lte: newDate("2015-08-27T19:53:13.912Z") 
      } 
     } 
     ] 
    }{ 
     $unwind: "$info" 
    }, 
    { 
     $match: { 
     $or: [ 
      { 
      "info.name": "messageType", 
      "info.value": "Push" 
      } 
     ] 
     } 
    ]); 

唯一的例子在他们的文档使用并有一些例子here但我不能让它工作。

我没连上了过去的第一场比赛,这是我有:

ArrayList<String> ids = new ArrayList<>(); 
      ids.add("199941"); 
      ids.add("199951"); 
    Query<Event> q = ads.getQueryFactory().createQuery(ads); 
    q.and(q.criteria("identifier").in(ids)); 
    AggregationPipeline pipeline = ads.createAggregation(Event.class).match(q); 
Iterator<Event> iterator = pipeline.aggregate(Event.class); 

一些帮助或指导,以及如何开始与查询或者它是如何工作将是巨大的。

回答

1

您需要创建查询match()管道通过将您的代码拆分成易于管理的部分。所以让我们开始 与查询匹配的标识符字段,你已经完成了迄今为止。我们需要结合查询的$or部分。

从你离开凡经营,创建完整的查询为:

Query<Event> q = ads.getQueryFactory().createQuery(ads); 
Criteria[] arrayA = { 
    q.criteria("info.name").equal("messageType"), 
    q.criteria("info.value").equal("Push"), 
    q.field("timestamp").greaterThan(start); 
    q.field("timestamp").lessThan(end); 
}; 

Criteria[] arrayB = { 
    q.criteria("info.name").equal("messageType"), 
    q.criteria("info.value").equal("Push") 
}; 

q.and(
    q.criteria("identifier").in(ids), 
    q.or(arrayA) 
); 

Query<Event> query = ads.getQueryFactory().createQuery(ads); 
query.or(arrayB); 

AggregationPipeline pipeline = ads.createAggregation(Event.class) 
            .match(q) 
            .unwind("info") 
            .match(query); 
Iterator<Event> iterator = pipeline.aggregate(Event.class); 

以上是未经测试,但将引导您走得更近家,所以做一些必要的调整,在适当情况下。对于一些参考,下面的SO问题可能会给你一些指点:

  1. Complex AND-OR query in Morphia
  2. Morphia query with or operator

,当然还有AggregationTest.java Github的页面

+0

非常感谢,我能创建查询。我有一个问题是arrayB声明'q.criteria'中的'q'变量应该替换为'query.criteria'。如果不是为什么? – Jimmy