3

次のようなドキュメントのコレクションがあります: {

ipAddr: '1.2.3.4',
"results" : [
             {
                     "Test" : "Sight",
                     "Score" : "FAIL",
                     "Reason" : "S1002"
             },
             {
                     "Test" : "Speed",
                     "Score" : "FAIL",
                     "Reason" : "85"
             },
             {
                     "Test" : "Sound",
                     "Score" : "FAIL",
                     "Reason" : "A1001"
             }
     ],
     "finalGrade" : "FAILED"

}

これが私が書き込もうとしている集計クエリです。私がやりたいこと (コメントアウトされた部分を参照) は、「理由/エラー」コードの ipAddr ごとにグループ化されたフィールドを作成することですが、理由コードがで始まる場合にのみ特定の文字を入力し、コードを一度に追加するだけで、次のことを試しました:

 db.aggregate([
   {$group: 
        {  _id: "$ipAddr", 
         attempts: {$sum:1}, 
         results: {$push: "$finalGrade"},    
        // errorCodes: {$addToSet: {$cond: ["$results.Reason": /[A|B|S|N.*/, "$results.Reason", ""]}},                                                              
        finalResult: {$last: "$finalGrade"} } 
   }
]);

コメントアウトされた「errorCodes」行を除いて、すべてが機能します。私が作成しようとしているロジックは次のとおりです。

上記のレコードの場合、errorCodes セットには以下が含まれている必要があります:
... errorCodes: [S1002,A1001], ...

4

2 に答える 2

5

$group条件式をとることができないため、その行は機能しません。は、 (とりわけ)反復表現$projectに基づいて元のドキュメントを変換できるフェーズです。$cond

できるようになる前に、集計パイプラインに2つのステップが必要です。$group最初$unwindに結果配列を作成し、次に$match気にしない結果を除外する必要があります。

これは、保持する必要のないエラーコードを含む結果を破棄するという単純なことですが、すべてのエラーコードを含む失敗の総数をカウントしたいようですが、特定のエラーコードのみを出力に追加します。配列?これを行う簡単な方法はありません$group $unwind。パイプラインで2つのパスを作成する必要があります。

これに似た何かがそれを行います:

db.aggregate([
   {$unwind : "$results"},
   {$group:
        { _id: "$ipAddr",
          attempts: {$sum:1},
          results: {$push : "$results"},
          finalGrade: {$last : "$finalGrade" } 
        } 
   },
   {$unwind: "$results"},
   {$match: {"results.Reason":/yourMatchExpression/} },
   {$group: 
        {  _id: "$ipAddr", 
         attempts: {$last:"$attempts"},    
         errorCodes: {$addToSet: "$results.Reason"},                                                              
        finalResult: {$last: "$finalGrade"}
   }
]);

一致するエラーコードを持つ試行のみをカウントしたい場合は、単一でそれを行うことができます- 、、および$groupを実行する必要があります。$ projectをそのまま使用できますが、errorCodesの配列には、すべての適切なエラーコードとともに空の文字列エントリが含まれます。$unwind$match$group$cond

于 2013-01-12T03:57:03.803 に答える