1

を返します。MongoDBのルックアップ機能は 従業員のコレクションは、次のように私は2つのMongoDBのコレクションの従業員や部門を持つ空の配列結果

{ 
"_id" : ObjectId("58c4a35ac2e604024321788e"), 
"id_employee" : 19, 
"employee_name" : "Lene Vestergaard Hau", 
"employee_address" : "Allerton", 
"hours" : 279, 
"id_department" : 1, 
"projects" : [ 
    285, 
    453, 
    499, 
    804, 
    956 
], 
"Children" : [ 
    { 
     "id_child" : 38, 
     "child_name" : "Caroline Herschel" 
    } 
] 

}

部門コレクション:

{ 
"_id" : ObjectId("58c49c48c2e669d6555aa5a7"), 
"id_department" : 1, 
"department_name" : "dept1", 
"projects" : [ 
    { 
     "id_project" : 285, 
     "project_name" : "1project 285", 
     "duration" : "211" 
    }, 
    { 
     "id_project" : 453, 
     "project_name" : "1project453", 
     "duration" : "214" 
    }, 
    { 
     "id_project" : 499, 
     "project_name" : "1project499", 
     "duration" : "224" 
    }, 
    { 
     "id_project" : 804, 
     "project_name" : "1project804", 
     "duration" : "217" 
    } 
    { 
     "id_project" : 956, 
     "project_name" : "1project956", 
     "duration" : "217" 
    } 

] 私は検索機能を実行して、 プロジェクトの詳細をすべて取得しようとしていますe。私が使用しているJavaコード:

coll.aggregate(Arrays.asList(
     Aggregates.match(Filters.eq("id_employee",19)), 
     Aggregates.unwind("$projects"), 
     Aggregates.lookup("department", "projects",    "projects.id_project", "lookupData") 

)).forEach(printBlock); 
} 

上記のコードを返すlookupDataは空のリストです。誰でも助けてくれますか?

+0

実際には2つの理由があります。単に「department.projects.id_project」というフィールドはありません。パスは実際には '' projects.id_project "'ですが、あなたの質問で指定したデータのどれにも実際には一致する値はありません。一致するデータを持つ '$ lookup'の結果は、実際に一致するプロジェクトだけでなく、実際には' 'department" '文書全体になるため、どのような結果が期待されるのかも不明です。だからあなたの意図がプロジェクト情報を得ることであったならば、ここでもやるべきことはまだまだあります。モデリングはいくつかのリビジョンで行うことができます。 –

+0

どのフレームワークと実際にどの言語を使って作業しているかは、本当に不明です。コードの中には "spring-data-mongodb"があります。しかし何らかの理由でそこに '.forEach()'があるので、あなたがシェルや他の何かでこれをしようとしているように見えます。それは本当に不明です。 –

+0

Neilに感謝します。最初の理由については、コレクション名(department)から始まり、配列名(projects)と最後のフィールド名(id_project)から始まるフィールド全体のパスを使用しました。私はコレクション名を省略しましたが、問題は解決されませんでした。 2番目の理由から部門コレクションに一致するフィールドがありますが、私の質問に一致するデータはコピーされませんでした。私はjavaとjava mongoドライバを使用しています。3.4.1 –

答えて

0

以下の集計を試すことができます。

employeeコレクション内の一致projectsdepartmentコレクションからprojects_deptデータをマップするために$indexOfArray続い部門を取得するためにid_departmentに参加します。

Document mapProject = Document.parse(
"{ 
    "$let": { 
     "vars": { 
     "projects_dept": { 
      "$arrayElemAt": [ 
      "$dept_projects.projects", 
      0 
      ] 
     } 
     }, 
     "in": { 
     "$map": { 
      "input": "$projects", 
      "as": "project", 
      "in": { 
      "$arrayElemAt": [ 
       "$$projects_dept", 
       { 
       "$indexOfArray": [ 
        "$$projects_dept.id_project", 
        "$$project" 
       ] 
       } 
      ] 
      } 
     } 
     } 
    } 
    }" 
); 

List<Bson> output = Arrays.asList(
     Aggregates.match(Filters.eq("id_employee",19)), 
     Aggregates.lookup("department", "id_department", "id_department", "dept_projects"), 
     Aggregates.addFields(new Field<>("projects", mapProject)) 
); 
関連する問題