MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Lấy tổ tiên trong MongoDb bằng cách sử dụng cấu trúc cây

non-trivial giải pháp.

YÊU CẦU

1 Chúng ta cần thêm trường bổ sung (hãy gọi nó là level ) cho biết vị trí của tài liệu bên trong hệ thống phân cấp.

|root        0
|-child A    1
|--child A_1 2
|-child B    1

2 Chúng ta cần define độ sâu phân cấp trước đây (ví dụ:tối đa 3)

GIỚI HẠN

Để lọc từ cấp cụ thể, chúng tôi cần sửa đổi rootchildren $ trận đấu giá trị.

Đảm bảo luôn cấp độ phân cấp:

root     - 0
children - 1

root     - 1
children - 2  

GIẢI PHÁP

db.documents.aggregate([
  {
    $facet: {
      root: [
        {
          $match: {
            level: 0
          }
        }
      ],
      children: [
        {
          $match: {
            level: 1
          }
        },
        {
          $graphLookup: {
            from: "documents",
            startWith: "$_id",
            connectFromField: "_id",
            connectToField: "parentId",
            maxDepth: 0,
            as: "hierarchy"
          }
        },
        {
          $sort: {
            _id: 1
          }
        }
      ]
    }
  },
  {
    $unwind: "$root"
  },
  {
    $project: {
      "root._id": 1,
      "root.name": 1,
      "root.level": 1,
      "root.hierarchy": {
        $filter: {
          input: "$children",
          as: "sub_level",
          cond: {
            $eq: [
              "$$sub_level.parentId",
              "$root._id"
            ]
          }
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$root"
    }
  }
])

MongoPlayground (độ sâu tối đa:3) | MongoPlayground (độ sâu tối đa:4)

GIẢI THÍCH

  1. Với $facet chúng tôi xác định cấu trúc mức. root chỉ tất cả thư mục gốc. children chứa tất cả trẻ em có con cháu cấp 1 trở lên.

  2. Chúng tôi $filter (hợp nhất) root và con theo parentId

  3. Với $project$replaceRoot chúng tôi trả lại cấu trúc ban đầu.

LIÊN KẾT

https://docs.mongodb.com/manual/reference/operator/ tổng hợp / khía cạnh /
https://docs.mongodb.com/manual/ tham chiếu / toán tử / tổng hợp / bộ lọc /
https://docs.mongodb.com/manual/ tham chiếu / điều hành / tổng hợp / thay thếRoot /




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB - khác biệt với truy vấn không sử dụng chỉ mục

  2. Mongodb / Mongoid - {:multi => true} có nghĩa là gì

  3. Dữ liệu tham chiếu NoSql

  4. Chèn đối tượng python trong mongodb

  5. Lớp được tạo Mapstruct sử dụng trình tạo Lombok từ cha thay vì con