2013-10-08 54 views
1

我在MongoDB中存儲了一些樹狀結構的數據。它看起來像這樣:在MongoDB中選擇樹的一部分

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }, 
     { 
      "name": "gizmo" 
     }] 
    }] 
} 
{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

我想在子樹上查詢,並希望只提取匹配查詢樹的部分。在每個節點中,最多隻有一個與查詢匹配的子樹。

在這個測試查詢中,我想找到匹配路徑「foo/bar/gizmo」的樹的部分。所以,我曾嘗試以下:

db.Test.find({ 
    name: "foo", 
    subs: { 
     $elemMatch: { 
      name: "bar", 
      subs: { 
       $elemMatch: { 
        name: "gizmo" 
       } 
      } 
     } 
    } 
}, 
{ 
    "subs.subs": { 
     $slice: 1 
    } 
}) 

結果我得到的是

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "baz" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

,而我其實是想

{ 
    "_id": 1, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
}{ 
    "_id": 2, 
    "name": "foo", 
    "subs": [{ 
     "name": "bar", 
     "subs": [{ 
      "name": "gizmo" 
     }] 
    }] 
} 

是否有可能做到這一點?我曾嘗試在子樹上使用$elemMatch投影算子,但似乎目前Mongo不支持(不能在嵌套字段上使用$ elemMatch投影(當前不支持))。

+0

數組不能給予的MongoDB多的愛。你需要重組你的文件。 – WiredPrairie

回答

0

您可以使用Aggregation Framework根據需要獲取結果。試試下面的代碼:

db.Test.aggregate(
{$unwind : "$subs"}, 
{$unwind : "$subs.subs"}, 
{$match : {name : "foo", "subs.name" : "bar", "subs.subs.name" : "gizmo"}} 
); 

結果會是這樣的:陣列內的

"result" : [ 
    { 
     "_id" : ObjectId("52540da2e3a2c44e082642d4"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    }, 
    { 
     "_id" : ObjectId("52540dd6e3a2c44e082642d5"), 
     "name" : "foo", 
     "subs" : { 
      "name" : "bar", 
      "subs" : { 
       "name" : "gizmo" 
      } 
     } 
    } 
]