Tùy thuộc vào trường hợp sử dụng của bạn, MongoDB v3.4 cung cấp một đường dẫn tổng hợp toán tử được gọi là $ graphLookup . Toán tử tổng hợp có thể thực hiện tìm kiếm đệ quy trên một tập hợp. Xem thêm definiton trên định nghĩa $ graphLookup .
Sử dụng hệ thống phân cấp và giá trị tài liệu của bạn ở trên làm ví dụ, bạn có thể thử chạy tập hợp bên dưới:
db.collectionName.aggregate([
{$unwind:{
path:"$childrenIdList",
preserveNullAndEmptyArrays: true}
},
{$graphLookup:{
from:"collectionName",
startWith:"$_id",
connectFromField:"_id",
connectToField:"childrenIdList",
as:"myparents",
restrictSearchWithMatch: {"_id"}}
},
{$match: {"_id": 7 } },
{$group:{
_id:"$_id",
parents:{$addToSet:"$myparents._id"}
}}
]);
Ở trên sẽ trả về kết quả như sau:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Phải nói rằng, nếu bạn có một bộ sưu tập lớn, truy vấn trên có thể không hiệu quả vì bạn sẽ thực hiện $ unwind trên mỗi tài liệu và sẽ không thể sử dụng các chỉ mục. Theo gợi ý của những người khác, bạn nên xem xét lại cấu trúc mô hình tài liệu của mình. Xem Cấu trúc cây mô hình dữ liệu . Tối ưu hóa dựa trên logic ứng dụng và trường hợp sử dụng truy vấn của bạn, đồng thời để lược đồ tài liệu linh hoạt tuân theo.