1

J'ai deux employés des collections de MongoDB et le département comme suit collection des employés:mongodb de recherche retourne un tableau vide résultat

{ 
"_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" 
    } 
] 

}

collection du département:

{ 
"_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" 
    } 

] I J'essaie d'effectuer une fonction de recherche pour obtenir tous les détails sur les projets pour l'employeur e. Le code java que j'utilise:

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

)).forEach(printBlock); 
} 

le code ci-dessus renvoie lookupData en tant que liste vide. Quelqu'un peut-il aider s'il vous plaît?

+0

Il y a deux raisons en fait. Il n'y a tout simplement pas de champ tel que "" department.projects.id_project "'. Le chemin est en fait '" projects.id_project "', mais l'autre raison est qu'aucune des données que vous fournissez avec votre question n'a de telles valeurs correspondantes. On ne sait pas non plus quel résultat vous attendez, puisque le résultat '$ lookup' avec les données correspondantes sera en fait le document' 'department '' entier, et pas seulement le projet correspondant. Donc, si votre intention était d'obtenir l'information sur le projet, il y aurait encore un peu plus de travail à faire ici. Votre modélisation pourrait faire avec une révision. –

+0

Il est également difficile de savoir quel cadre et quelle langue vous travaillez. Une partie du code suggère "spring-data-mongodb"? Mais pour une raison ou pour une autre, il y a '.forEach()' dedans, donc on dirait que vous essayez de le faire dans le shell ou quelque chose d'autre. Donc tout cela n'est vraiment pas clair. –

+0

Merci Neil pour votre commentaire. En ce qui concerne la première raison, j'ai utilisé tout le chemin du champ en commençant par le nom de la collection (département) puis le nom du tableau (projets) et le nom du champ à la fin (id_project). J'ai également omis le nom de collection mais le problème n'a pas été résolu. pour la deuxième raison, il y a un champ correspondant dans la collection du département, mais je n'ai pas copié les données correspondantes dans ma question. J'utilise Java et le pilote java mongo 3.4.1 –

Répondre

0

Vous pouvez essayer l'agrégation ci-dessous.

JOIN sur id_department pour aller chercher le département suivi par $indexOfArray pour cartographier les données projects_dept de la collection department la correspondance projects dans la collecte employee.

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)) 
);