2012-04-24 69 views
10

Tôi gặp vấn đề khi truy xuất thông tin giữa hai bộ sưu tập. Các cửa hàng thu thập thông tin nhân viên đầu tiên:Truy vấn MongoDB TRONG mảng đối tượng

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

thứ hai thông tin khoa

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

Tôi cố gắng tìm: Tất cả các bộ phận cho một nhân viên đưa.

tôi đã cố gắng một cái gì đó như:

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

Nhưng tôi không biết làm thế nào tôi có thể giải thích $ trong department_id của tất cả các bộ phận từ các nhân viên var.

Trả lời

6

Điều này không thể thực hiện được bằng truy vấn đơn giản. Bạn sẽ phải lặp qua các employee.departments và cho mỗi lần lặp lại, hãy thêm các department_id của nó vào một mảng. Mảng này bạn có thể sử dụng trong dòng thứ hai của bạn. Đây là điều tốt nhất được thực hiện bằng ngôn ngữ bạn chọn.

Để làm cho việc này dễ dàng hơn, bạn sẽ phải thay đổi giản đồ của mình. Một tùy chọn là để lưu trữ thông tin bộ phận trong hồ sơ của nhân viên, nhưng trong trường hợp của bạn, bạn sẽ sao chép rất nhiều dữ liệu.

tôi thay vào đó sẽ đề nghị để có từng bộ phận chứa một danh sách với ID nhân viên và số ngày thay vì như thế này:

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

Trong trường hợp đó, bạn có thể sau đó chỉ cần chạy:

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

Ok .. Vâng tôi biết về vấn đề thiết kế. Nhưng tôi không chia sẻ tất cả thông tin về các phòng ban. Trong thực tế, mỗi phòng ban có một danh sách các nhà quản lý (xem: cập nhật bài viết) rằng tại sao tôi chia tay khởi hành và nhân viên. Và you'r đúng về vòng lặp hơn nhưng tôi muốn biết nếu nó có thể làm điều này với truy vấn đơn giản – Kakawait

+0

tôi đã cập nhật câu trả lời của tôi, để thực hiện công việc này, bạn sẽ cần phải thiết kế lại lược đồ của bạn. – Derick

1

Có một cách dễ dàng để thực hiện điều đó trong Mongo 3.2, ít nhất chỉ trong một thao tác đơn lẻ:

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

$elemMatch công cụ sửa đổi (xem ref) giúp truy vấn dựa trên giá trị giống như mảng của thuộc tính đối tượng.

+0

Điều này có vẻ tuyệt vời, nhưng tôi hơi bối rối. Bạn có thể vui lòng thêm tài liệu bạn đang truy vấn vào câu trả lời này và nhận xét mã không? Tôi rất vui khi được thăng hoa. –

Các vấn đề liên quan