java - Mongodb Morphia 聚合

标签 java mongodb morphia

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

一些帮助或指导以及如何开始查询或其工作原理将会很棒。

最佳答案

您需要为 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);

以上内容未经测试,但会指导您在离家更近的地方,因此请在适当的情况下进行一些必要的调整。对于一些引用,以下问题可能会给您一些提示:

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

当然还有 AggregationTest.java Github 页面

关于java - Mongodb Morphia 聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35210654/

相关文章:

java - ubuntu 不支持 major.minor 版本 52.0

java - 使用比较器时如何排除字符串

ruby-on-rails - Mongoid::错误::混合关系

java - 如何在 PlayFramework 2.5 (JAVA) 中配置 Morphia/MongoDB 数据源

java - 使用 elem 对子文档数组进行 Morphia 查询

java - 使用吗啡按字符串列表上的元素查询 MongoDB

java - Spark-Java-foreachPartition

java - 在 LWJGL 中使用 : Display. getDisplayMode().getHeight() 获取显示属性时出现 NoSuchMethodError

java - MongoDB:[错误]:无法连接到位于本地主机的 MongoDB:27017

mongodb - 在 MongoDB 数组的相同元素中查找 2 个或更多条件