2016-08-08 2 views
0

製品在庫ログから私はMongoDBコレクションを作成しました。関連する項目は、SKU、在庫、日付です。製品在庫が更新されるたびに、総在庫と新しいエントリがあります。MongoDBクエリグループとサブグループ

skusは2つの部分で構成されています。親パーツ、たとえば 'A'とバリアントまたは子パーツは '1'、 '2'、 '3'などと言います。スキューは次のようになります。 'A2'

私はこのクエリで、日によってグループ化された単一の製品在庫、を照会することができます

[{ 
     $match: { 
      sku: 'A2' 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       year: {$year: '$date'}, 
       day: {$dayOfYear: '$date'} 
      }, 
      stock: { 
       $min: '$stock' 
      }, 
      date: { 
       $first: '$date' 
      } 
     } 
    }, 
    { 
     $sort: { 
      date: 1 
     } 
    }] 

注:私は毎日のための最低限の株式をしたいです。

しかし、私はすべてのバリエーション(最小)を追加する必要があります。 $ matchオブジェクトを$ groupステージに変更するには:

[{ 
     $match: { 
      sku: /^A/ 
     } 
    } 

$グループステージで 'サブ'グループを作成するにはどうすればよいですか?

EDIT: 'A1' と一日の 'A2' のいずれかの

{ 
    sku: 'A1', 
    date: '2015-01-01', 
    stock: 15 
} 

{ 
    sku: 'A1', 
    date: '2015-01-01', 
    stock: 14 
} 

{ 
    sku: 'A2', 
    date: '2015-01-01', 
    stock: 20 
} 

二株式:

データは次のようになります。私のクエリ(1日ごとにグループ化されたすべてのスキュー)は、結果として株価が14になる(3つの値のうちの最小値)。しかし、私は結果が34になるように20(A2の場合はmin)プラス14の場合(A1の場合min)

+0

このドキュメントの説明は、コード自体で最もよく理解されていますが、いくつかのサンプルドキュメントと期待される出力は何ですか? – chridam

答えて

0

グループフェーズの_idフィールドにskuを追加すると、 sku、年&日。

db.stocks.aggregate(
[ 
    { 
    $group: { 
     _id: { 
      sku: '$sku', 
      year: {$year: '$date'}, 
      day: {$dayOfYear: '$date'} 
     }, 
     stock: { 
      $min: '$stock' 
     }, 
     date: { 
      $first: '$date' 
     } 
    } 
    }, 
    { 
    $sort: { 
     date: 1 
    } 
    }] 
) 
関連する問題