MongoDB,2 个查询的公共部分

MongoDB, common part of 2 Querys

我得到了这样的文档

@Document(collection="myDocument")
public class MyDocument {
    @Id
    private String id;

    private List<Dates> dates;
}

public class Dates{
    private String key;     
    private DateTime value;
}

OtherDocument 是来自各种来源的 DateTime 值的容器,我不能简单地在 MyDocument 中创建像 DateTime birthdate; 这样的字段,因为我不知道 key 将会,它们只是一些描述 MyDocument 的日期。现在,我需要为这些值创建搜索引擎,例如,有人想要找到所有 MyDocumentsdates,其中包含:
key : "Birthdate" 大于
value : "1990-01-01 00:00:00 +00:00"

key : "Mather's birthday" 小于
value: "1975-01-01 00:00:00 +00:00"

因此,Criteria(此处使用 MongoTemplate)首先可能看起来像这样

Criteria criteria = Criteria.where("myDocument.dates.value")
    .exists(true)
    .gt(DateTimeUtil.valueOf("1990-01-01 00:00:00 +00:00"))  //just converting String to DateTime here      
    .and("myDocument.dates.name")
    .exists(true)
    .all("Birthday"));

第二个:

 Criteria criteria = Criteria.where("myDocument.dates.value")
     .exists(true)
     .lt(DateTimeUtil.valueOf("1975-01-01 00:00:00 +00:00"))  
     .and("myDocument.dates.name")
     .exists(true)
     .all("Mather's birthday"));

问题是,我不能将这两个 Criteria 放在一个 Query 中,这会导致错误。到目前为止我发现的唯一解决方案是在这种情况下将 2 个分开 Query 然后使用找到公共部分 resultA.retainAll(resultB)

但重点是,我不想,这个数据库将存储大量数据,这些请求将非常[=55= 】 频繁。我需要它快速工作,并且在纯 Java 中组合 2 个列表对于那么多的数据来说会很慢。有什么想法可以解决吗?

编辑# 这是当我尝试将 2 Criteria 像这样组合成一个 Query

时抛出的错误

caught: (java.lang.RuntimeException), msg(json can't serialize type : class org.joda.time.DateTime) java.lang.RuntimeException: json can't serialize type : class org.joda.time.DateTime

您可以使用以下代码。 $and 一起查询并使用 $elemMatch 在多个条件下匹配日期字段。

类似

Criteria criteria1 = Criteria.where("dates").
    elemMatch(
      Criteria.where("value").exists(true).gt(DateTimeUtil.valueOf("1990-01-01 00:00:00 +00:00"))
      .and("name").exists(true).all("Birthday")
);
Criteria criteria2 = Criteria.where("dates").
    elemMatch(
      Criteria.where("value").exists(true).lt(DateTimeUtil.valueOf("1975-01-01 00:00:00 +00:00"))
       .and("name").exists(true).all("Mather's birthday")
);
Criteria criteria = new Criteria().andOperator(criteria1, criteria2);

注意:您可能仍然遇到 joda 时间转换的问题。