2012-04-24 7 views
10

Ich habe Probleme, Informationen zwischen zwei Sammlungen abzurufen. Die erste Kollektion speichert Mitarbeiter Informationen:MongoDB Abfrage IN Array von Objekt

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

die zweite die Abteilungen Information

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

Ich versuche zu finden: Alle Abteilungen für einen bestimmten Mitarbeiter.

Ich habe versucht, so etwas wie:

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

Aber ich weiß nicht, wie ich $ in department_id aller Abteilungen von var Mitarbeiter erklären kann.

Antwort

6

Dies kann nicht mit einer einfachen Abfrage durchgeführt werden. Sie müssen die Datei employees.dapartments durchlaufen und für jede Iteration ihre departments_id zu einem Array hinzufügen. Dieses Array können Sie dann in Ihrer zweiten Zeile verwenden. Dies ist etwas, das am besten in Ihrer Sprache Ihrer Wahl gemacht wird.

Um dies zu vereinfachen, müssen Sie Ihr Schema ändern. Eine Option ist, die Abteilungsinformationen in der Mitarbeiterakte zu speichern, aber in Ihrem Fall würden Sie eine Menge Daten duplizieren.

Ich würde stattdessen vorschlagen, jede Abteilung eine Liste mit Mitarbeiter-IDs und Daten statt wie diese enthalten haben:

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

In diesem Fall können Sie dann starten Sie einfach:

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

Ok .. Ja, ich weiß über Design-Problem. Aber ich habe nicht alle Informationen über Abteilungen geteilt. In der Tat hat jede Abteilung eine Liste von Managern (siehe: Post-Update), warum ich Abteilungen und Mitarbeiter aufgeteilt habe. Und Sie sind wirklich über Schleife vorbei, aber ich wollte wissen, ob es möglich ist, dies mit einer einfachen Abfrage zu tun – Kakawait

+0

Ich habe meine Antwort aktualisiert, damit dies funktioniert, müssen Sie Ihr Schema neu gestalten. – Derick

1

Es gibt eine einfache Möglichkeit, das zu tun, in Mongo 3.2, zumindest in nur einem einzigen Arbeitsgang:

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

Die $elemMatch Modifizierer (siehe ref) hilft bei der Abfrage eines Array-ähnlichen Werts einer Objekteigenschaft.

+0

Das sieht gut aus, aber ich bin ein wenig verwirrt. Könnten Sie bitte das Dokument, das Sie abfragen, zu dieser Antwort hinzufügen und den Code kommentieren? Ich würde gerne upvote. –