2016-08-23 7 views
2

私はmongoDB javaドライバを使用して、集計フレームワークで日付範囲間のトランザクションを照会しています。私はMongoのクエリ次使用しようとしています:集計での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の同等にMongoのクエリを変換する方法はあり。

ありがとうございます。続くよう

+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パラメータをlongとしても動作します。

関連する問題