有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

mongodb Mongo match在聚合中不适用于使用java的日期

我正在使用mongoDB java驱动程序通过聚合框架查询日期范围之间的事务。我尝试使用以下mongo查询:

db.orders.aggregate([
{ "$match":{
    "order_commit_time": {
        "$gte": ISODate("2015-04-30T18:30:00.000Z"),
        "$lte": ISODate("2016-08-23T19:53:23.000")
    }
}
},
{
"$unwind": "$discounts_list"
}, {
"$unwind": "$discounts_list.discount_split"
}, {
"$group" :{
    "_id": null,
    count:{$sum:1}
}
}]
);

我用来进行查询的java代码如下:

Date startDate = new Date(period.getStartTime().getTimeInMillis());
Date endDate = new Date(period.getEndTime().getTimeInMillis());

BasicDBObject match = new BasicDBObject("$match", new BasicDBObject(mongoDateField, 
    new BasicDBObject("$gte", startDate).append("$lte", endDate)));
BasicDBObject discount_list = new BasicDBObject("$unwind", "$discounts_list");
BasicDBObject discount_split = new BasicDBObject("$unwind", "$discounts_list.discount_split");
BasicDBObject group = new BasicDBObject("$group", new BasicDBObject("_id", null)
    .append("count", new BasicDBObject("$sum", 1)));
AggregationOutput output = mongoCollection.getCollection().aggregate(match, discount_list, discount_split, group);

但是这个java查询返回的是空结果。然而,如果我在控制台上使用mongo查询,它工作得很好。此外,如果我从聚合中删除匹配项,查询可以正常工作,但不会根据日期过滤结果。此外,在count或find as查询中使用相同的“match”DBObject时,其工作原理如下:

query = new BasicDBObject(mongoDateField, new BasicDBObject("$gte", startDate).append("$lte", endDate));
mongoCount = mongoCollection.getCollection().count(query);

有没有办法将mongo查询转换为java等效查询

提前谢谢


共 (2) 个答案

  1. # 1 楼答案

    你试过这个吗

    BasicDBObject match = new BasicDBObject("$match", new BasicDBObject(mongoDateField, 
        new BasicDBObject("$gte", period.getStartTime().getTimeInMillis()).append("$lte", period.getEndTime().getTimeInMillis())));
    

    我刚刚发布了一个新的基于注释的库,它与Spring Data@Query注释类似,但用于聚合查询。这将消除所有锅炉板代码,并允许您仅通过在存储库接口方法上声明此注释来执行聚合查询。它还可以将date参数作为long参数使用

  2. # 2 楼答案

    只需使用“allowDiskUse(true)”,如下所示:

    AggregationOutput output = mongoCollection.getCollection().aggregate(match, discount_list, discount_split, group).allowDiskUse(true);