Nếu bạn thêm trường parent
để nắm bắt nguồn gốc cho mỗi nút, nó có thể giúp tối ưu hóa việc truy vấn trên tập dữ liệu lớn hơn. Ví dụ:
{"parent": "", "node": "#a"}
{"parent": "#a", "node": "#a#b"}
{"parent": "#a", "node": "#a#c"}
{"parent": "#a#b", "node": "#a#b#1"}
{"parent": "#a#b", "node": "#a#b#2"}
{"parent": "#a#c", "node": "#a#c#1"}
{"parent": "#a#c#1", "node": "#a#c#1#x"}
Sau đó, bạn có thể sử dụng $ graphLookup (tổng hợp) toán tử để đi ngang.
Một giải pháp thay thế cho truy vấn regex của bạn để lấy tất cả các nút con của nút cây cho #a#c
:
db.tree.aggregate([
{$match:{"node":"#a#c"}},
{$graphLookup:{
from:"tree",
startWith:"$node",
connectFromField:"node",
connectToField:"parent",
as:"dep"}},
{$project:{"dep.node":1, "_id":0}}
])
Chỉ tìm các lá của #a#c
:
db.tree.aggregate([
{$match:{"parent": {$regex:"^#a#c"}}},
{$graphLookup:{
from:"tree",
startWith:"$node",
connectFromField:"node",
connectToField:"parent",
as:"dep"}},
{$match:{dep:[]}},
{$project:{"_id":0, node:1}}
])
Tôi cũng khuyên bạn nên xem lại Cấu trúc cây mô hình , có nhiều cách khác nhau để sử dụng cấu trúc dữ liệu cây trong MongoDB. Tùy thuộc vào trường hợp sử dụng của bạn, bạn nên sử dụng các cấu trúc nhất định cho các lợi ích truy vấn ứng dụng của bạn.