【发布时间】:2016-08-23 16:34:23
【问题描述】:
我正在使用 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 查询,它工作正常。此外,如果我从聚合中删除匹配,查询工作正常,但不根据日期过滤结果。此外,相同的“匹配”DBObject,当用于 count 或 find 作为查询时,可以像这样正常工作:
query = new BasicDBObject(mongoDateField, new BasicDBObject("$gte", startDate).append("$lte", endDate));
mongoCount = mongoCollection.getCollection().count(query);
有什么方法可以将 mongo 查询转换为 java 等价物。
提前致谢。
【问题讨论】:
-
是否可以使用调试器来询问 BasicDBObject 对象,以确认它们看起来是否正确?
-
我已经检查过了,没问题。我已经在网上搜索过,有这样的问题,但没有解决方案。与此类似:stackoverflow.com/questions/15987601/…
标签: java mongodb mongodb-query