2015-09-18 17 views
5

私は今、redactと戦っていますが、わかりません。mongodbのredactがわかりにくいようです

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 57.92947112575566 
     }, 
     { 
      "type" : "quiz", 
      "score" : 21.24542588206755 
     }, 
     { 
      "type" : "homework", 
      "score" : 68.19567810587429 
     }, 
     { 
      "type" : "homework", 
      "score" : 67.95019716560351 
     }, 
     { 
      "type" : "homework", 
      "score" : 18.81037253352722 
     } 
    ] 
} 

I:

私はちょうど

コレクション「等級」の文書はこのようになります(それはMongoDBのオンライントレーニングから来ている)ドキュメントを読んで、コレクションの等級に墨消しを使用してみました次のクエリを使用します。

db.grades.aggregate([ 
    { $match: { student_id: 0 } }, 
    { 
     $redact: { 
      $cond: { 
       if: { $eq: [ "$type" , "exam" ] }, 
       then: "$$PRUNE", 
       else: "$$DESCEND" 
      } 
     } 
    } 

] );

このクエリでは、試験の種類ごとにこのサブ文書を除外する必要があります。

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [ 
    { 
     "type" : "quiz", 
     "score" : 21.24542588206755 
    }, 
    { 
     "type" : "homework", 
     "score" : 68.19567810587429 
    }, 
    { 
     "type" : "homework", 
     "score" : 67.95019716560351 
    }, 
    { 
     "type" : "homework", 
     "score" : 18.81037253352722 
    } 
] 
} 

が、私は条件を反転すると、私は唯一の試験が結果に保持されていることを期待::そして、それは動作しますが、結果は

if: { $eq: [ "$type" , "exam" ] }, 
     then: "$$DESCEND", 
     else: "$$PRUNE" 

結果が空であるが。

「試験」タイプのサブ文書が含まれていない理由を理解できません。

+1

もう一度mongodb大学の宿題。 – styvane

+2

@ user3100115宿題に関する質問は、洞察を求める方法で書かれ、十分な成績を収めた完成した解決策ではなく、必ずしも悪い質問ではありません。 – Philipp

+1

@フィリピンしかし、私は最初の手の経験から、生徒達はかなり長い方法で各ステップを教えられていることを知っています。詳細、追加するかもしれないし、ドキュメントも悪くない。私の視点から見ると、各クラスの目的は、ドキュメンテーションが多かれ少なかれリマインダになるように十分な情報を学生に与えることです。この文脈では、既存のクエリに沿った質問はちょっと... ...私にとっては恣意的なようです。 –

答えて

8

$redactステージは、ルートドキュメントとそのフィールドから開始し、そのドキュメントが$$DESCENDの条件を満たす場合にのみ、そのドキュメントに含まれるサブドキュメントを調べます。

{ 
    "_id" : ObjectId("50b59cd75bed76f46522c34e"), 
    "student_id" : 0, 
    "class_id" : 2, 
    "scores" : [] // Some array. I will look at this later. 
} 

それもここtypeフィールドを見つけることができませんので、$eq: [ "$type" , "exam" ]がfalseである:それは、$墨消し、ドキュメントでない最初の事はこれを検討することを意味します。条件が偽であるときに$ redactに何をしたのですか? else: "$$PRUNE"であるため、サブ文書が検査される前に文書全体が整理されます。

$type"exam"の場合、または存在しない場合は、テストしてください。明示的に実用的な解決策を求めていないので、これを行う方法を理解するための練習として残しておきます。

+0

よろしくお願いいたします。私は解決策を探していませんでしたが、私は説明を探していて、あなたのことは素晴らしかったです。どうもありがとう。 –

+0

推奨される回避策を実装しようとしていますが、動作させることができません。どのような作業コードの例があれば幸いです! – papaiatis

+0

@papaiatisあなたのサンプル文書と既に試したコードで新しい質問をしてください。 – Philipp

関連する問題