我收到的文件看起来像这样
@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类
答案 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时间转换的问题。