2012-04-24 18 views
10

2つのコレクション間で情報を取得するのに問題があります。 最初のコレクションを格納し、従業員の情報:MongoDBクエリINオブジェクトの配列

{ 
     "_id" : ObjectId("4f9643967f8b9a3f0a00005a"), 
     "birth_date" : "1963-09-09", 
     "departments" : [ 
       { 
         "departments_id" : ObjectId("4f9643957f8b9a3f0a000007"), 
         "from_date" : "1990-01-03", 
         "to_date" : "1990-01-15" 
       } 
     ], 
     "first_name" : "Parviz", 
     "gender" : "M", 
     "hire_date" : "1990-01-03", 
     "last_name" : "Lortz", 
} 

秒1部門情報

{ 
     "_id" : ObjectId("4f9643957f8b9a3f0a000004"), 
     "dept_name" : "Marketing", 
     "managers" : [ 
       { 
         "employees_id" : ObjectId("4f96439b7f8b9a3f0a0186a9"), 
         "from_date" : "1985-01-01", 
         "to_date" : "1991-10-01" 
       }, 
       { 
         "employees_id" : ObjectId("4f96439b7f8b9a3f0a0186aa"), 
         "from_date" : "1991-10-01", 
         "to_date" : "9999-01-01" 
       } 
     ] 
} 

私は探してみてください:与えられた従業員すべての部門を。

私のような何か試してみました:

employees = db.employees.find({_id:ObjectId("some_id")}); 
db.departments.find({_id:{$in:...}}); 

をしかし、私はVaRの従業員からのすべての部門のDEPARTMENT_IDに$を説明できるのか分かりません。

答えて

6

これは単純なクエリでは実行できません。 employees.departmentsをループし、繰り返しごとにdepartments_idを配列に追加する必要があります。この配列を2行目で使用できます。これはあなたの選択した言語で最も良いことです。

これを簡単にするには、スキーマを変更する必要があります。 1つの選択肢は、 に部門情報を従業員レコードに格納することですが、あなたのケースでは多くのデータを複製することになります。

私の代わりに、従業員IDを持つリストが含まれており、次のように代わりにさかのぼり、各部門を持つことを示唆している:その場合は

{ 
     "_id" : ObjectId("4f9643957f8b9a3f0a000004"), 
     "dept_name" : "Marketing", 
     "managers" : [ 
     ] 
     "employees" : [ 
      { 
        "employee_id" : ObjectId("4f9643967f8b9a3f0a00005a"), 
        "from_date" : "1990-01-03", 
        "to_date" : "1990-01-15" 
      } 
     ] 
} 

、あなたは、単に実行できます。

db.departments.find({ "employees.employee_id": ObjectId("some_id") }); 
+0

いいえ..私はデザインの問題について知っています。しかし、私は部署に関するすべての情報を共有していませんでした。実際、各部門には、なぜ私が部署と従業員を分割したのかというマネージャのリストがあります(ポスト更新を参照)。ループオーバーについては真実ですが、単純なクエリでこれを行うことができるかどうかを知りたがっています。 – Kakawait

+0

私は自分の答えを更新しました。この作業をするには、スキーマを再設計する必要があります。 – Derick

1

があります少なくとも1回の操作で、Mongo 3.2で簡単に行うことができます。

const employees = db.employees.find(); // query the employees collection 
db.departments.find({ 
    managers: { 
    $elemMatch: { 
     employees_id: { 
     $in: employees.map(e => e._id) 
     } 
    } 
    } 
}); 

$elemMatch修飾子(ref参照)は、オブジェクトのプロパティの配列に似た値に対してクエリを実行するのに役立ちます。

+0

これは素晴らしいようですが、私はちょっと混乱しています。あなたは、この回答に質問している文書を追加してコードをコメントしてください。私はupvoteに満足しています。 –

関連する問題