Spring MongoDB查询文件,如果天差为x天

jed*_*ard 14 java criteria mongodb spring-data-mongodb spring-boot

我有一个有两个日期字段的集合,我试图查询所有相差15天的记录:

{
   "_id" : "someid",
   "factoryNumber" : 123,
   "factoryName" : "some factory name",
   "visitType" : "audit",
   "personelId" : "somePersonel",
   "lastVisit": ISODate("2018-10-30T00:00:00.000+0000"),
   "acceptedDate" : ISODate("2018-11-16T00:00:00.000+0000")
}
Run Code Online (Sandbox Code Playgroud)

现在在某些情况下acceptedDate不会出现,所以我需要根据当前日期对其进行评估.不完全确定如何在spring中编写这种类型的查询以获得期望的结果.

    Criteria.where("acceptedDate"). 
(is 15 days past last visit or current date if last visit not present)
Run Code Online (Sandbox Code Playgroud)

use*_*814 10

从3.6开始,你必须使用new运算符$expr,它允许在匹配查询或常规查询中使用聚合表达式.

您可以创建json查询并直接传递它,因为$exprSpring在常规查询中不支持.

15天= 15*24*60*60*1000 = 1296000000毫安

Query query = new BasicQuery("{'$expr':{'$gte':[{'$subtract':[{'$ifNull':['$acceptedDate',{'$date':" + System.currentTimeMillis() + "}]},'$lastVisit']},1296000000]}}");
List<Document> results = mongoTemplate.find(query, Document.class);
Run Code Online (Sandbox Code Playgroud)

3.4版本

如果你想使用spring mongo方法,你必须使用投影来添加保持比较的新字段,然后是匹配操作和额外投影以删除比较字段.不幸的$addFields是仍然不支持,所以你必须使用AggregationOperation手动创建一个新的阶段.

AggregationOperation addFields = new AggregationOperation() {
    @Override
    public Document toDocument(AggregationOperationContext aggregationOperationContext) {
        Document document = new Document("comp", Document.parse("{'$gte':[{'$subtract':[{'$ifNull':['$acceptedDate', {'$date':" + System.currentTimeMillis() + "}]},'$lastVisit']},1296000000]}}"));      
        return new Document("$addFields", document);
    }
};

Aggregation aggregation = Aggregation.newAggregation(
        addFields,
        Aggregation.match(Criteria.where("comp").is(true))
        Aggregation.project().andExclude("comp");
);

List<Document> results = mongoTemplate.aggregate(aggregation, collection name, Document.class).getMappedResults();
Run Code Online (Sandbox Code Playgroud)

3.2版本

AggregationOperation redact = new AggregationOperation() {
    @Override
    public DBObject toDBObject(AggregationOperationContext aggregationOperationContext) {
    Map<String, Object> map = new LinkedHashMap<>();
    map.put("if",  BasicDBObject.parse("{'$gte':[{'$subtract':[{'$ifNull':['$acceptedDate', {'$date':" + System.currentTimeMillis() + "}]},'$lastVisit']},1296000000]}}"));
    map.put("then", "$$KEEP");
    map.put("else", "$$PRUNE");
    return new BasicDBObject("$redact", new BasicDBObject("$cond", map));
};

Aggregation aggregation = Aggregation.newAggregation(redact);

List<FactoryAcceptance> results = mongoTemplate.aggregate(aggregation, FactoryAcceptance.class, FactoryAcceptance.class).getMappedResults();
Run Code Online (Sandbox Code Playgroud)