Mongo匹配聚合不使用java工作日期

时间:2016-08-23 16:34:23

标签: java mongodb mongodb-query

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

                JSONObject json;
JSONArray jsonArray = null;
            if (json != null) {

                jsonArray = json.getJSONArray("mainTags");
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject c = jsonArray.getJSONObject(i);

                Sting name = c.getString("name");
                    Log.d("namee", name);


                }


            } else {
                // Log.d("Server Unreachable",
                // "Unable to Perform Your request.Server Is Unreachable! Please Try Later.");
            }
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

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

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查询返回空结果。但是,如果我在控制台上使用mongo查询,它工作正常。此外,如果我从聚合中删除匹配,查询工作正常,但不会根据日期过滤结果。此外,相同的“匹配”DBObject,当在count或find as query中使用时,可以正常工作:

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);

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

提前致谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 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。