【问题标题】:Mongodb Morphia aggregationMongodb Morphia 聚合
【发布时间】:2016-02-05 05:00:08
【问题描述】:

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

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"
          }
        ]
      }
    ]);

他们文档中的唯一示例是使用 out 并且有一些示例 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);

一些帮助或指导以及如何开始查询或它是如何工作的将会很棒。

【问题讨论】:

    标签: java mongodb morphia


    【解决方案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 页面

    【讨论】:

    • 非常感谢,我能够创建查询。我有一个问题是arrayB声明中的'q'变量'q.criteria'应该替换为'query.criteria'。如果不是为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2012-05-10
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多