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
的日期。现在,我需要为这些值创建搜索引擎,例如,有人想要找到所有 MyDocuments
和 dates
,其中包含:
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 时间转换的问题。
我得到了这样的文档
@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
的日期。现在,我需要为这些值创建搜索引擎,例如,有人想要找到所有 MyDocuments
和 dates
,其中包含:
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 时间转换的问题。