2017-09-15 43 views
2

模擬示例。二MongoDB的集合,departmentsemployees查詢mongodb中變化的多級關係

部門

{ _id: '101' } 
{ _id: '102', parent: '101' } 
{ _id: '103', parent: '101' } 
{ _id: '104', parent: '103' } 

員工

{ _id: '201', department: '101' } 
{ _id: '202', department: '102' } 
{ _id: '203', department: '102' } 
{ _id: '204', department: '103' } 
{ _id: '205', department: '104' } 

我如何可以查詢所有員工的部門清單,或任何下級部門(由department.parent引用屬性)?

因此,對於上面的例子中,查詢:

  • 部門101應該給員工的文檔201, 202, 203, 204, 205
  • 部門102應該給員工的文檔202, 203, 204, 205
  • 部門103應該給員工的文檔204, 205

如果無法查詢部門樹中「任意數量」的級別,則可以提供「最多N級」結果的查詢是完全可以接受的。

+0

用你目前的數據結構很難做到這一點(可行,但效率不高)。我建議你將子域添加到部門來模擬樹結構。這會讓你的生活變得更加輕鬆。請參閱https://docs.mongodb.com/manual/tutorial/model-tree-structures/ – spiritwalker

回答

0

$lookup在MongoDb中執行一個左外部聯接到同一個數據庫中的非輪廓集合。

如果我們的集合之間有一層關係,那麼我們可以通過$查找來對集合進行聚合。

假設我們有關係的一個級別(比如一個部門的員工)給定的樣本集合,然後聚集查詢

db.department.aggregate([ 
    { 
     $lookup: 
     { 
      from: "employees", 
      localField: "_id", 
      foreignField: "department", 
      as: "result" 
     } 
    } 
]) 

_id自處收集只採取聚集和上級部門關係不採取聚合

和上面給出的樣品收集結果是

{ 
     "_id" : "101", 
     "result" : [ 
       { 
         "_id" : "201", 
         "department" : "101" 
       } 
     ] 
} 
{ 
     "_id" : "102", 
     "parent" : "101", 
     "result" : [ 
       { 
         "_id" : "202", 
         "department" : "102" 
       }, 
       { 
         "_id" : "203", 
         "department" : "102" 
       } 
     ] 
} 
{ 
     "_id" : "103", 
     "parent" : "101", 
     "result" : [ 
       { 
         "_id" : "204", 
         "department" : "103" 
       } 
     ] 
} 
{ 
     "_id" : "104", 
     "parent" : "103", 
     "result" : [ 
       { 
         "_id" : "205", 
         "department" : "104" 
       } 
     ] 
} 

請注意,MongoDB是一個NoSQL數據庫,設計我們的集合模式是一種很好的做法,使得集合之間不存在或非常少的關係。