2016-04-19 1 views
-1

私は文字列フィールド "action"と "receivedTimestamp" Dateフィールドを持つドキュメントのコレクションを持っています。その値は2016年3月と4月のものです。それぞれのアクションがいくつあるかを数えようとしています期間私はこれを実行するとMongoの集計に日付範囲が壊れていますか?

は:

db.getCollection('foo').aggregate([ 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

は、私が68件の結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$gte": new Date("2016-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

は、私が68件の結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$gte": new Date("2017-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

は、私が68件の結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$lte": new Date("2017-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

私は0結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$lte": new Date("2016-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

私は0結果を得ます。

私はMongoの集計が日付範囲を壊していると思っています。私が間違っている?

+0

すべてのドキュメントに 'new Date(" 2017-01-01 ")'より大きい 'receivedTimestamp'があるということはできませんか? –

+0

いいえ、彼らはすべて3月と2016年4月からです。 – Jacob

+1

恐ろしいタイトルで、広く使用されているソフトウェアが基本的に壊れているかどうか尋ねる前に、その事実を "広く使われている"と考えるべきです。もちろん、それは壊れていませんが、***あなたのデータ**はおそらくあります。 68件の結果を忘れてください。しかし、** 4件の結果**をドキュメントとして表示してください。あるいは、あなたの記録されたデータに正確に間違っていることを喜んで指摘してください。もちろん、本当の問題はここにあります。 –

答えて

0

はISODateに切り替えることで、これを解決:私はこれを実行すると

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$gte": new ISODate("2016-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

を、私は68件の結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$gte": new ISODate("2017-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

私は0結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$lte": new ISODate("2016-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

私は0結果を得ます。私はこれを実行すると

は:

db.getCollection('foo').aggregate([ 
    {"$match": {"receivedTimestamp": {"$lte": new ISODate("2017-01-01")}}}, 
    {"$group": {"_id": "$action", "count": {"$sum": 1}}} 
]) 

は、私が68件の結果を得ます。

これは私が見ると予想される動作です。私は、この文脈でISODateを使用するための要件に関する文書を知らない。

関連する問題