MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Buat pohon simpul dengan tabel rekursif dengan Express dan Mongo

Anda dapat menggunakan $graphLookup dan operator larik berguna lainnya,

  • $match filter yang merekam hanya memiliki parent_id adalah null
  • $graphLookup untuk mendapatkan catatan anak dan nomor kedalaman di depthField level
  • $unwind dekonstruksi children array dan izinkan untuk tidak menghapus anak-anak kosong
  • $sort menurut bidang tingkat kedalaman level dalam urutan menurun
  • $group dengan id bidang dan merekonstruksi children susunan
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 sekarang temukan anak-anak level bersarang dan alokasikan ke levelnya,
    • $reduce untuk mengulang loop children susunan.
    • inisialisasi bidang default level nilai defaultnya adalah -1, presentChild adalah [], prevChild adalah [] untuk tujuan kondisi
    • $let untuk menginisialisasi bidang:
      • prev sesuai kondisi jika keduanya level sama, lalu kembalikan prevChild jika tidak, kembalikan presentChild
      • current sesuai kondisi jika keduanya level sama maka kembalikan presentChild jika tidak []
    • in untuk mengembalikan level bidang dan prevChild bidang dari bidang yang diinisialisasi
      • presentChild $filter children dari prev array dan kembali, gabungkan objek saat ini dengan children array menggunakan $mergeObjects dan concat dengan current array let menggunakan $concatArrays
  • $addFields untuk mengembalikan hanya presentChild array karena kita hanya membutuhkan array yang diproses
  {
    $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"
    }
  }
])

Taman bermain




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Memasukkan Date() ke Mongodb melalui mongo shell

  2. Menggunakan operator posisi MongoDB $ dalam kueri dokumen yang sangat bersarang

  3. Bagaimana melakukan grup mongo di sisi server Meteor

  4. Apakah ada cara untuk memulihkan dokumen yang baru dihapus di MongoDB?

  5. Bagaimana cara mem-porting Instance Google Compute Engine?