【问题标题】:Mongo match in aggregate not working for date using javaMongodb 总体匹配不适用于使用 java 的日期
【发布时间】: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


【解决方案1】:

只要使用“allowDiskUse(true)”,如下,

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

【讨论】:

  • 如果您得到帮助,请考虑接受答案。这将有助于其他人解决相同类型的问题。
  • 我重置密码只是为了登录并投票赞成这个答案!像魅力一样工作!
【解决方案2】:

你试过了吗?

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

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

【讨论】:

    猜你喜欢
    • 2020-12-22
    • 2020-11-28
    • 2020-09-27
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多