与范围内的空日期进行比较
Compare with null Date in range
@Document
public class Product extends Item {
private Date onlineDate;
private Date offlineDate;
}
数据
Product {
onlineDate : some date
offlineDate : null
}
下方查询return 0次点击
query.addCriteria(Criteria.where("onlineDate").lte(date).and("offlineDate").gte(date))
但下面查询 returns 个结果
query.addCriteria(Criteria.where("onlineDate").lte(date))
这是我不允许与空日期进行比较的东西吗?
您基本上需要在结果中包含接受 null
的条件。现在您正在询问 "is greater than" 提供的日期,而 null
不是 "greater than",因此它被排除在外。
这意味着添加一个 $or
条件来测试该字段上的两个可能条件:
Criteria criteria = Criteria.where("onlinedate").lte(date).orOperator(
Criteria.where("offlinedate").gte(date),
Criteria.where("offlinedate").is(null)
);
Query query = new Query().addCriteria(criteria);
System.out.println(query.getQueryObject());
哪个会给你:
{
"onlinedate" : { "$lte" : date } ,
"$or" : [
{ "offlinedate" : { "$gte" : date } } ,
{ "offlinedate" : null }
]
}
这是更改您的查询以允许 null
值的正确翻译,但它确实让我认为您对查询的基本想法是不正确的,因为这将 return 结果基本上是说 "still online"。这可能是您想要的,但话又说回来,您可能一直打算提出不同的要求。
如果您实际上正在寻找 "all" 文档 没有 具有提供的 date
值 "betweeen" 中的两个值文档,那么您将改为 "invert" 范围表达式来匹配文档 "between",然后 "invert" 结果与 $nor
相反:
Criteria criteria = new Criteria().norOperator(
Criteria.where("onlinedate").gte(date)
.and("offlinedate").lte(date)
);
Query query = new Query().addCriteria(criteria);
System.out.println(query.getQueryObject());
这会产生如下查询:
{
"$nor" : [
{
"onlinedate" : { "$gte" : date },
"offlinedate" : { "$lte" : date }
}
]
}
returning 结果是 "before" 和 "after" 两个日期属性之间的范围,或者 "offline"
日期是 null
和范围不是 "closed".
这取决于您实际想要的结果集,要么包含 null
值来查找 "still open" 的数据,要么只包含 "exclude the range" 来查找而是超出范围的数据。
@Document
public class Product extends Item {
private Date onlineDate;
private Date offlineDate;
}
数据
Product {
onlineDate : some date
offlineDate : null
}
下方查询return 0次点击
query.addCriteria(Criteria.where("onlineDate").lte(date).and("offlineDate").gte(date))
但下面查询 returns 个结果
query.addCriteria(Criteria.where("onlineDate").lte(date))
这是我不允许与空日期进行比较的东西吗?
您基本上需要在结果中包含接受 null
的条件。现在您正在询问 "is greater than" 提供的日期,而 null
不是 "greater than",因此它被排除在外。
这意味着添加一个 $or
条件来测试该字段上的两个可能条件:
Criteria criteria = Criteria.where("onlinedate").lte(date).orOperator(
Criteria.where("offlinedate").gte(date),
Criteria.where("offlinedate").is(null)
);
Query query = new Query().addCriteria(criteria);
System.out.println(query.getQueryObject());
哪个会给你:
{
"onlinedate" : { "$lte" : date } ,
"$or" : [
{ "offlinedate" : { "$gte" : date } } ,
{ "offlinedate" : null }
]
}
这是更改您的查询以允许 null
值的正确翻译,但它确实让我认为您对查询的基本想法是不正确的,因为这将 return 结果基本上是说 "still online"。这可能是您想要的,但话又说回来,您可能一直打算提出不同的要求。
如果您实际上正在寻找 "all" 文档 没有 具有提供的 date
值 "betweeen" 中的两个值文档,那么您将改为 "invert" 范围表达式来匹配文档 "between",然后 "invert" 结果与 $nor
相反:
Criteria criteria = new Criteria().norOperator(
Criteria.where("onlinedate").gte(date)
.and("offlinedate").lte(date)
);
Query query = new Query().addCriteria(criteria);
System.out.println(query.getQueryObject());
这会产生如下查询:
{
"$nor" : [
{
"onlinedate" : { "$gte" : date },
"offlinedate" : { "$lte" : date }
}
]
}
returning 结果是 "before" 和 "after" 两个日期属性之间的范围,或者 "offline"
日期是 null
和范围不是 "closed".
这取决于您实际想要的结果集,要么包含 null
值来查找 "still open" 的数据,要么只包含 "exclude the range" 来查找而是超出范围的数据。