2012-04-24 15 views
10

Mam problem z pobieraniem informacji między dwiema kolekcjami. Pierwsze sklepy kolekcja pracowników informacje:Zapytanie MongoDB W tablicy obiektu

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

druga informacja działy

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

staram się znaleźć: Wszystkie działy dla danego pracownika.

Próbowałem coś takiego:

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

Ale nie wiem, jak mogę wytłumaczyć $ w department_id wszystkich działów z pracownikami Var.

Odpowiedz

6

Nie można tego zrobić za pomocą prostego zapytania. Będziesz musiał pętli nad employee.departments i dla każdej iteracji dodaj jej department department do tablicy. Ta tablica może następnie użyć w drugiej linii. To jest coś, co najlepiej zrobić w wybranym języku.

Aby to ułatwić, musisz zmienić swój schemat. Jedną z opcji jest zapisywanie informacji o oddziale w rekordzie pracownika, ale w twoim przypadku powielanie dużej ilości danych.

bym zamiast sugerować, aby każdy dział zawiera listę identyfikatorów pracowniczych i terminach zamiast tak:

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

W takim przypadku można po prostu uruchomić:

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

Ok .. Tak, wiem o problemie projektowania. Ale nie udostępniłem wszystkich informacji o działach. W rzeczywistości każdy dział ma listę menedżerów (patrz: po aktualizacji), dlaczego dzieliłem wydziały i pracowników. I masz rację, jeśli chodzi o pętlę, ale chciałem się dowiedzieć, czy można to zrobić za pomocą prostego zapytania. – Kakawait

+0

Zaktualizowałem moją odpowiedź, aby to zadziałało, musisz przeprojektować swój schemat. – Derick

1

Jest to prosty sposób na Mongo 3.2, przynajmniej w jednej operacji:

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

The 012 Modyfikator(patrz ref) pomaga w zapytaniu o wartość podobną do tablicy właściwości obiektu.

+0

To wygląda świetnie, ale jestem trochę zdezorientowany. Czy możesz dodać dokument, do którego chcesz wysłać odpowiedź, i skomentować kod? Byłbym szczęśliwy, gdyby udało mi się przegłosować. –

Powiązane problemy