2011-12-17 55 views
6

Tôi cần lưu trữ cấu trúc cây đệ quy. Danh sách được liên kết.
Vì vậy, tất cả các đối tượng đều giống nhau. Mỗi con trỏ có một con trỏ đến một đối tượng cha và mỗi con có một mảng các đối tượng con.
Tôi có thể lưu trữ một cấu trúc như vậy ở Mongo không.
tức là một bộ sưu tập Mongo đối tượng cha mẹ, mỗi đối tượng chứa bên trong nó một bộ sưu tập Mongo của các đối tượng con.Bộ sưu tập MongoDB có thể có bên trong bộ sưu tập khác không?

$a = $MyCollection->findOne(**some conditions)->Childs->find(...) 

Trả lời

3

Bạn không thể lưu trữ bộ sưu tập trong bộ sưu tập. Nhưng bạn có thể lưu trữ các id tham chiếu các đối tượng trong các bộ sưu tập khác. Bạn sẽ phải giải quyết id cho tài liệu hoặc phần tử và sau đó nếu phần tử đó lưu trữ nhiều id, bạn sẽ cần phải giải quyết những điều đó và bật. Tài liệu có nghĩa là để được giàu có và trùng lặp dữ liệu nhưng trong các tài liệu họ giải thích rằng thay vì nhúng bạn chỉ có thể sử dụng id

5

MongoDB có thể lưu trữ các tài liệu phụ:

Node 
{ 
    "value" : "root" 
    "children" : [ { "value" : "child1", "children" : [ ... ] }, 
        { "value" : "child2", "children" : [ ... ] } ] 
} 

Tuy nhiên, tôi không khuyên bạn nên sử dụng subdocuments cho cấu trúc cây hoặc bất cứ thứ gì khá phức tạp. Subdocuments không phải là công dân cấp một; chúng không phải là vật phẩm sưu tập. Ví dụ:

Ví dụ: giả sử bạn muốn có thể nhanh chóng tìm thấy các nút có giá trị nhất định. Thông qua chỉ mục trên value, tra cứu đó sẽ nhanh chóng. Tuy nhiên, nếu giá trị nằm trong một subdocument, nó sẽ không được lập chỉ mục bởi vì nó không phải là giá trị của một phần tử sưu tập.

Do đó, nó thường là tốt hơn để thực hiện tuần tự bằng tay và lưu trữ một danh sách các id thay vì:

Node 
{ 
    "_id" : ObjectId("..."), 
    "parentId" : ObjectId("..."), // or null, for root 
} 

Bạn sẽ phải làm một số tuần tự bằng tay để lấy id yếu tố tương ứng của.

Gợi ý Giả sử bạn muốn tìm nạp toàn bộ nhánh cây. Thay vì lưu trữ chỉ id cha mẹ trực tiếp, bạn có thể lưu trữ tất cả tổ tiên Id thay vì:

"ancestorIds": [id1, id2, id3]

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