2016-10-31 9 views
1

私は、次の集計クエリがある:このMongoDB集約クエリは何も返しません。

db.radars.aggregate([ 
    { 
     $group: { 
      _id: '$locationId', 
      count: {$sum: 1} 
     }, 
    }, 
    { 
     $match: { 
      loggedAt: { 
       $gte: new Date('2014-01-01T00:00:00Z'), 
       $lte: new Date('2016-12-31T00:00:00Z') 
      } 
     } 
    } 
]); 

は、私は間違いなく、条件に一致するデータを持っている:

enter image description here

をしかし、私は何を取得:

enter image description here

誰もが知っていますなぜこれが起こっているのでしょうか?

+0

試み、 'loggedAt:{ $ GTE:新しい日付(1388534400)、 $のLTE:新しい日付(1483142400) }' – gaston

+0

残念なことに、同じ結果です。しかし、 'loggedAt:{$ push: '$ loggedAt'}'を使うと助けになります。 –

答えて

2

$groupした後、パイプラインは$groupで定義されたフィールドだけでドキュメントが含まれます:_idcountそう照合するいかなるloggedAtフィールドがありません。

出力に応じて、$matchを最初に実行するか、アキュムレータをloggedAtに追加して$groupに追加してください。例えば

:代わりdateStringsのタイムスタンプとdatefieldsに合わせて

db.radars.aggregate([ 
    { 
     $group: { 
      _id: '$locationId', 
      count: {$sum: 1}, 
      loggedAt: {$push: '$loggedAt'} 
     }, 
    }, 
    { 
     $match: { 
      loggedAt: { $elemMatch: { 
       $gte: new Date('2014-01-01T00:00:00Z'), 
       $lte: new Date('2016-12-31T00:00:00Z') 
      } } 
     } 
    } 
]); 
+0

興味深い。これは機能します。不思議なことに、以前に私が投稿したクエリでそれが動作していたと私は誓っています。 '$ elemMatch'を取り除くと、クエリはまだ動作しているようです - ' $ elemMatch'は必要ですか? –

+1

'$ elemMatch'は> =と<= termsを満たす単一の' loggedAt'要素にマッチすることを保証します。 – JohnnyHK

+0

私は参照してください。面白い。 locationIdごとに見つかったすべての単一文書の 'loggedAt'の値が集計結果に含まれるようになりました。私は何百万もの文書を持っているので、結果は16MBを超えています。 'loggedAt'を含まないようにする方法はありますか? –

関連する問題