2017-02-07 7 views
0

MongoDBにクエリを書き込もうとしています。これは、必要なドキュメントを返すためにクエリされたドキュメントの一部に依存しています。Mongodb同じドキュメントに依存するクエリ

これは、これらのドキュメントのフォーマットの一例である:

{ 
    "_id" : ObjectId("58990510cdab041b39c78dd1"), 
    "classcode" : "CS433", 
    "department" : "CS", 
    "instructor" : { 
      "name" : "Mike", 
      "office" : "Starbucks" 
    }, 
    "students" : [ 
      { 
        "name" : "Dave", 
        "major" : "CS", 
        "gradyear" : 2019 
      }, 
      { 
        "name" : "Joe", 
        "major" : "CS", 
        "gradyear" : 2018 
      }, 
      { 
        "name" : "Stan", 
        "major" : "CS", 
        "gradyear" : 2017 
      } 
    ] 
} 

私は大手でその部門のない試合があるかどうかを支援する部署を表した文字列を使用します。すなわち、部門がCSである場合には、CSを専攻としていない学生がいるかどうかをチェックする。

私は$ne$elemMatchを知っています。私はちょうど質問を助けるために文書の別の部分を使用することに問題があります。私はここでサブクエリが使用されるとは思わない。

答えて

1

$redactを使用できます。一度にドキュメントレベルを通過し、再帰的にmajorフィールドを探して、$$ROOTレベルからの基準に$$DESCEND$$PRUNEを実行するために

$redact

クエリはmajordepartmentに一致していないすべての学生を維持します。

db.collection.aggregate([{ 
    "$redact": { 
     "$cond": [{ 
       $ne: ["$major", "$$ROOT.department"] 
      }, 
      "$$DESCEND", 
      "$$PRUNE" 
     ] 
    } 
}]) 

更新:majordepartmentに一致しないと、少なくとも一人の学生があるとき

このクエリは、すべての文書を返します。

db.collection.aggregate([ 
    { $redact: { 
     $cond: { 
      if: { "$ifNull" : ["$department", false] }, 
      then: { $cond: { 
       if: { $anyElementTrue: { 
        $map: { 
         input: "$students", 
         as: "student", 
         in: { $ne: [ "$$student.major", "$$ROOT.department" ] } 
        } 
       }}, 
       then: "$$DESCEND", 
       else: "$$PRUNE" 
      }}, 
      else: "$$DESCEND" 
     } 
    }} 
]) 
+0

これは、ドキュメント全体のみを返しますが、配列内のさまざまな学生のドキュメントは返されません。私は学生の専攻の少なくとも1つがクラスの部門と同じでないすべての文書を返すようにしています。 –

+0

更新されたクエリを試してください。あなたが意図した通りに動作しない場合は、期待される応答を投稿に追加してください。 – Veeram

+0

更新されたクエリは正しいオブジェクトを返します。集計関数を使わずに、代わりに関数findを使ってこれを実行する方法を知っていますか?私は、私の答えが非常に単純であると思われ、集合関数なしで行うことができることを問い合わせるように質問されました。 –

関連する問題