2012-04-24 163 views
10

我有兩個集合之間檢索信息的問題。 第一個集合存儲員工信息:MongoDB查詢在對象數組中

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

第二個部門的信息

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

我試圖找到:所有部門指定員工

我想是這樣的:

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

但我不知道我怎樣才能從VAR員工各部門的部門標識說明$。

回答

6

這不能用簡單的查詢來完成。您將不得不遍歷employees.departments併爲每個迭代添加其departments_id到數組。這個數組然後你可以在你的第二行中使用。這是最好的選擇語言。

爲了使這更容易,你必須改變你的模式。一種選擇是 將部門信息存儲在員工記錄中,但在您的情況下,您將複製大量數據。

我反而建議讓每個部門包含與員工ID和日期,而不是像這樣的列表:

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

在這種情況下,你就可以簡單地運行:

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

好的..是的,我知道設計問題。但我沒有分享有關部門的所有信息。實際上,每個部門都有一份管理人員名單(見:更新後),說明爲什麼我分裂了部門和員工。並且你真的關於循環,但我想知道是否可以用簡單的查詢來做到這一點 – Kakawait 2012-04-24 14:24:02

+0

我已經更新了我的答案,爲了使這項工作,你需要重新設計你的模式。 – Derick 2012-04-24 15:10:43

1

有一個簡單的方法來做到這一點在Mongo 3.2中,至少在一個單一的操作:

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

$elemMatch修飾符(請參閱ref)可幫助查詢對象屬性的類似數組的值。

+0

這看起來不錯,但我有點困惑。您能否將您要查詢的文檔添加到此答案中,並對代碼進行評論?我很樂意加入。 – 2016-06-16 12:10:47