2016-08-23 49 views
2

我正在使用mongoDB java驅動程序來查詢日期範圍與聚合框架之間的事務。我嘗試使用以下蒙戈查詢:Mongo匹配聚合不使用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代碼如下:

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,在計數使用或作爲查找查詢時,工作正常,像這樣:

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

有什麼辦法來蒙戈查詢轉換爲Java形式。

在此先感謝。

+0

是否可以使用調試器來詢問BasicDBObject對象,以確認它們是否正確? –

+0

我已經檢查過了,很好。我在網上搜索,有這樣的問題,但沒有解決方案。類似這樣:http://stackoverflow.com/questions/15987601/mongodb-v2-4-0-match-aggregate-not-working-with-date - 範圍# – user3165873

回答

1

只要使用 「allowDiskUse(真)」,作爲跟隨,

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

請考慮接受答案,如果你有幫助。它會幫助其他同類問題。 –

+0

我重置密碼只是爲了登錄併爲此答案投票!奇蹟般有效! –

1

你試試這個?

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

我剛剛發佈了一個新的基於註釋的庫,其工作方式類似於Spring Data @Query註釋,但是用於聚合查詢。這將消除所有的鍋爐板代碼,並允許您通過在存儲庫接口方法上聲明此註解來執行聚合查詢。它也適用於date參數。