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

Truy vấn đệ quy Mongodb không hoạt động như mong đợi với $ graphLookup

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

  • $match lọc các bản ghi chỉ có sponsor""
  • $graphLookup để lấy các bản ghi con và số chiều sâu ở cấp độ DeepField level
  • $unwind giải mã downline 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à cấu trúc lại downline mảng
  • $addFields bây giờ tìm cấp độ con lồng nhau và phân bổ cho cấp độ của nó,
    • $reduce để lặp lại vòng lặp của downline 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 downline từ prev mảng và trả về, hợp nhất các đối tượng hiện tại với downline 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ý đó
db.collection.aggregate([
  { $match: { sponsor: "" } },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$_id",
      connectFromField: "_id",
      connectToField: "sponsor",
      depthField: "level",
      as: "downline"
    }
  },
  {
    $unwind: {
      path: "$downline",
      preserveNullAndEmptyArrays: true
    }
  },
  { $sort: { "downline.level": -1 } },
  {
    $group: {
      _id: "$_id",
      sponsor: { $first: "$sponsor" },
      companyname: { $first: "$companyname" },
      downline: { $push: "$downline" }
    }
  },
  {
    $addFields: {
      downline: {
        $reduce: {
          input: "$downline",
          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",
                          {
                            downline: {
                              $filter: {
                                input: "$$prev",
                                as: "e",
                                cond: { $eq: ["$$e.sponsor", "$$this._id"] }
                              }
                            }
                          }
                        ]
                      }
                    ]
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  { $addFields: { downline: "$downline.presentChild" } }
])

Sân chơi




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để đổi tên tên trường trong Spring-mongodb khi chèn dữ liệu?

  2. mongodb nodejs - chuyển đổi cấu trúc hình tròn

  3. 2 cách để hiện một chỉ mục trong MongoDB

  4. Bộ tích lũy dài thay vì Double trong hàm MongoDB group ()

  5. Phần tử mảng cập nhật MongoDB