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

Tạo cây nút bằng bảng đệ quy với Express và Mongo

Bạn có thể sử dụng $ graphLookup và các toán tử mảng hữu ích khác,

  • $match lọc mà các bản ghi chỉ có parent_idnull
  • $graphLookup để lấy các bản ghi con và số chiều sâu ở cấp độ DeepField level
  • $unwind giải cấu trúc children mảng và cho phép không xóa phần con trống
  • $sort theo trường cấp độ sâu level theo thứ tự giảm dần
  • $group bởi id trường và tạo lại children mảng
db.collection.aggregate([
  { $match: { parent_id: null } },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$id",
      connectFromField: "id",
      connectToField: "parent_id",
      depthField: "level",
      as: "children"
    }
  },
  {
    $unwind: {
      path: "$children",
      preserveNullAndEmptyArrays: true
    }
  },
  { $sort: { "children.level": -1 } },
  {
    $group: {
      _id: "$id",
      parent_id: { $first: "$parent_id" },
      name: { $first: "$name" },
      type: { $first: "$type" },
      category: { $first: 1 },
      children: { $push: "$children" }
    }
  },
  • $addFields bây giờ tìm các cấp độ con lồng nhau và phân bổ cho cấp độ của nó,
    • $ giảm để lặp lại vòng lặp của children mảng.
    • khởi tạo trường mặc định level giá trị mặc định là -1, presentChild là [], prevChild là [] cho mục đích điều kiện
    • $let để khởi tạo các trường:
      • prev theo điều kiện nếu cả level bằng nhau thì trả về prevChild nếu không thì trả về presentChild
      • current theo điều kiện nếu cả level bằng nhau thì trả về presentChild nếu không thì []
    • in để trả về level trường và prevChild trường từ các trường đã khởi tạo
      • presentChild $filter children từ prev mảng và trả về, hợp nhất các đối tượng hiện tại với children mảng sử dụng $mergeObjects và nối với current mảng let sử dụng $concatArrays
  • $addFields để chỉ trả lại presentChild mảng vì chúng tôi chỉ yêu cầu mảng đã xử lý đó
  {
    $addFields: {
      children: {
        $reduce: {
          input: "$children",
          initialValue: { level: -1, presentChild: [], prevChild: [] },
          in: {
            $let: {
              vars: {
                prev: {
                  $cond: [
                    { $eq: ["$$value.level", "$$this.level"] },
                    "$$value.prevChild",
                    "$$value.presentChild"
                  ]
                },
                current: {
                  $cond: [{ $eq: ["$$value.level", "$$this.level"] }, "$$value.presentChild", []]
                }
              },
              in: {
                level: "$$this.level",
                prevChild: "$$prev",
                presentChild: {
                  $concatArrays: [
                    "$$current",
                    [
                      {
                        $mergeObjects: [
                          "$$this",
                          {
                            children: {
                              $filter: {
                                input: "$$prev",
                                as: "e",
                                cond: { $eq: ["$$e.parent_id", "$$this.id"] }
                              }
                            }
                          }
                        ]
                      }
                    ]
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $addFields: {
      id: "$_id",
      children: "$children.presentChild"
    }
  }
])

Sân chơi




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Có cách nào để buộc mongodb lưu trữ chỉ số nhất định trong ram không?

  2. Tạo dữ liệu thử nghiệm cho MongoDB

  3. Làm cách nào để kết nối với MongoDB trong Windows?

  4. Truy vấn lồng nhau Mongoose trên Mô hình theo trường của mô hình được tham chiếu của nó

  5. Tự động hoàn thành được lọc bằng mongodb