与范围内的空日期进行比较

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" 来查找而是超出范围的数据。