首页 > 解决方案 > 用于日期比较的 mongodb 过滤器

问题描述

从 Spring Boot 应用程序中,我正在查询 mongodb 集合以找出特定日期的活动协议。数据没有变化,有 31 个独特的协议。当我过去 7 天运行它时,它给了我 5 天的正确计数,但是昨天和今天它给了我 30 的计数。实际上所有收集的协议都是有效的。有多个具有相同协议 ID 的文档 - 删除我使用分组的重复项。我的代码是这样的:

public int getTotalActivePAsORActiveItemsByDate(LocalDate date1) {
    String collectionName = Constants.AGREEMENT_COLLECTION_NAME;
    final List<Bson> pipeline = new ArrayList<>();
    Bson q1 = match(Filters.and(Filters.eq("agreementStatus", "Active")));
    pipeline.add(q1);
    if(date1 != null) {
        Bson q2 = match(and(lte("validFromDate", date1), gte("validToDate", date1)));
        pipeline.add(q2);
    }
    String project = "{$project:{agreementId:1, " + "validFromDate:1, " + "validToDate: 1 " + "}}";
    pipeline.add(BasicDBObject.parse(project));
    String addUpStr = "{$group:{" + "_id:'$agreementId', " + "count :{'$sum':1} " + "}}";
    pipeline.add(BasicDBObject.parse(addUpStr));
    String cntStr = "{$group:{_id:null, val:{'$sum':1}}}";
    pipeline.add(BasicDBObject.parse(cntStr));
    MongoDatabase mongo = mongoTemplate.getDb();
    final AggregateIterable<Document> ret = mongo.getCollection(collectionName).aggregate(pipeline);
    int val = 0;
    try {
        val = ret.first().getInteger("val");
    } catch (final Exception e) {
        e.printStackTrace();
    }
    
    return val;
}

和一个样本文件:

{_id=600ae734d752d67e519a34b6, 
 agreementStatus=Active, 
 validFromDate=Wed Oct 01 05:30:00 IST 2014, 
 validToDate=Sun Mar 31 05:30:00 IST 2024, 
 agreementId=VPC_BF_NW_Hu_LU70_NSO_MULT_400002129_D57E911804B9

}

整个问题源于日期。mongodb 在日期比较中失败了吗?

标签: mongodbmongodb-queryaggregation-frameworkspring-data-mongodb

解决方案


推荐阅读