3

いくつかの集計クエリを実行する Mongo データベースがあります。実行したい単純化されたクエリは次のとおりです。

db.coll.aggregate([
 { $group: { 
   _id: 'fieldA', 
   fieldB: { $avg: '$fieldB' } 
 } },
])

fieldA でデータをグループ化し、fieldB の平均を計算します。とにかく、結果セットのいくつかの行は、fieldB の値として 0 を持っています。これには 2 つの理由が考えられます。

  1. 平均値は 0 です。
  2. グループ内のすべてのドキュメントに fieldB がありませんでした (または値として null がありました)。その場合、Mongo の動作は 0 を返します。

他のクエリを発行したり集計パイプラインを終了したりせずに、結果の選択で各行に対してどのシナリオが発生したかを判断することは可能ですか?

アップデート

次のように、いくつかのフィールドの集計を行っているため、null 以外のフィールドを除外することはできません。

db.coll.aggregate([
 { $group: { 
   _id: 'fieldA', 
   fieldB: { $avg: '$fieldB' },
   fieldC: { $avg: '$fieldC' } 
 } },
])

一部のドキュメントには、fieldB があっても fieldC がなく、その逆もあります。

4

2 に答える 2

2

$max (または $min) 演算子を使用して、グループ内の fieldB のすべてのインスタンスが null または欠落しているかどうかを判断できます。その場合、$max (または $min) 演算子は null を返すためです。この集計パイプラインを考えると:

c.aggregate([
    {$group: {
        _id: '$fieldA',
        avg: {$avg: '$fieldB'},
        max: {$max: '$fieldB'},
    }}
])

これらの文書で:

c.insert({fieldA: 1, fieldB: 3})
c.insert({fieldA: 1, fieldB: -3})

結果は次のとおりです。

{"_id": 1, "avg": 0, "max": 3}

一方、これらのドキュメントでは:

c.insert({fieldA: 1})
c.insert({fieldA: 1})

結果は次のとおりです。

{"_id": 1, "avg": 0, "max": null}

max フィールドの null 値は、グループ内のすべてのドキュメントで fieldB が null または欠落していたことを示しています。

お役に立てれば、

ブルース

于 2013-11-04T15:09:23.433 に答える