如何在java中使用mongo聚合中的“$ match”和“$ or”

时间:2017-05-22 12:41:09

标签: java mongodb mongodb-query aggregation-framework

我正在尝试使用聚合查询将匹配的文档加载到临时集合中。实际上,我能够将所有匹配的文档加载到MongoDB的临时集合中,但是我的java程序在for循环中抛出了Null指针异常。

我完全被困在这里。我可以在这种情况下知道空指针异常的原因。任何人都可以建议我同样的......

 Document query = {"$or":[{"roll":1,"joiningDate":{"$gte":ISODate("2017-04-11T00:00:00Z")}},{"roll":2,"joiningDate":{"$gte": ISODate("2017-03-17T00:00:00Z")}}]};

            Document match = new Document("$match",new Document("$or",query));

            Document out =new Document("$out","TempCol");

            System.out.println("Before Aggregation");

            AggregateIterable<Document> resultAgg = collection.aggregate(Arrays.asList(match,out));

            System.out.println("After aggregation");

            for (Document doc : resultAgg){


                    System.out.println("The result of aggregation match:-");

            }

            System.out.println("Completed");

1 个答案:

答案 0 :(得分:0)

我通常更喜欢将管道结构化为一个变量。

但是这里的一般想法是使用Document,您可以看到{}Arrays.asList,其中[]

List<Document> pipeline = Arrays.<Document>asList(
  new Document("$match",
    new Document("$or", Arrays.<Document>asList(
      new Document("roll", 1)
        .append("joiningDate", new Document(
          "$gte", new DateTime(2017,04,11,0,0,0, DateTimeZone.UTC).toDate()
        )),
      new Document("controlId", 2)
        .append("joiningDate", new Document(
          "$gte", new DateTime(2017,03,17,0,0,0, DateTimeZone.UTC).toDate()
        ))
    ))
  ),
  new Document("$out","TempCol")
);

AggregateIterable<Document> resultAgg = controlIssueCollection.aggregate(pipeline);

同时确保在构建Date对象时,使用您最喜欢的构造方法(对于我org.joda.time.DateTime),您正在使用UTC时间,除非您的意思是其他方式。如果您要与shell中显示的MongoDB中存储的值进行比较,那么您的意思是UTC。