MongoDB,2个查询的共同部分

时间:2018-08-17 11:17:40

标签: java spring mongodb spring-mongodb

我收到的文件看起来像这样

@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值的容器,我不能简单地在DateTime birthdate;内创建像MyDocument这样的字段,因为我不知道key会做什么是的,它们只是一些描述MyDocument的日期。现在,我需要为这些值创建搜索引擎,例如,某人想要找到包含以下内容的所有MyDocuments dates
key:“生日”大于
value:“ 1990-01-01 00:00:00 +00:00”

key:“母亲的生日”少于
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中,这会导致错误。到目前为止,我发现的唯一灵魂是在这种情况下制作两个单独的Query,然后使用 resultA.retainAll(resultB)

但是关键是,我不想,这个数据库将存储很多数据,而这些请求将非常频繁。我需要它来快速工作,并且用纯Java合并2个列表会变得很慢,因为有那么多数据。有什么想法如何处理吗?

编辑# 这是当我尝试将2个Criteria合并为一个Query

时抛出的错误
  

捕获到了:(java.lang.RuntimeException),msg(json无法序列化type:   org.joda.time.DateTime类)java.lang.RuntimeException:json无法   序列化类型:org.joda.time.DateTime类

1 个答案:

答案 0 :(得分:1)

您可以使用以下代码。 $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时间转换的问题。