MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Utwórz drzewo węzłów z tabelą rekurencyjną za pomocą Express i Mongo

Możesz użyć $graphLookup i inne przydatne operatory tablicowe,

  • $match filtr, który rekordy mają tylko parent_id jest null
  • $graphLookup aby uzyskać rekordy podrzędne i numer głębokości w deepField level
  • $unwind dekonstruować children tablicę i pozwól, aby nie usuwać pustych dzieci
  • $sort według poziomu głębokości pole level w porządku malejącym
  • $group przez id pole i zrekonstruuj children tablica
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 teraz znajdź zagnieżdżone dzieci poziomu i przydziel je do jego poziomu,
    • $reduce, aby iterować pętlę children tablica.
    • zainicjuj domyślne pole level domyślna wartość to -1, presentChild to [], prevChild jest [] dla celów warunków
    • $let aby zainicjować pola:
      • prev zgodnie z warunkiem, jeśli oba level są równe, a następnie zwróć prevChild w przeciwnym razie zwróć presentChild
      • current zgodnie z warunkiem, jeśli oba level są równe, a następnie zwróć presentChild inaczej []
    • in aby zwrócić level pole i prevChild pole z zainicjowanych pól
      • presentChild $filter children z prev array i return, połącz bieżące obiekty z children tablica przy użyciu $mergeObjects i połącz z current tablica let przy użyciu $concatArrays
  • $addFields aby zwrócić tylko presentChild array ponieważ wymagaliśmy tylko tej przetworzonej tablicy
  {
    $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"
    }
  }
])

Plac zabaw




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. jak liczyć osadzone php mongodb?

  2. Jak działa oddzwonienie zwrotne Mongoose?

  3. Zmień strukturę dokumentu w mongodb za pomocą powłoki mongo

  4. Reg:mongo db błędne wyjście zgodnie z zapytaniem

  5. Aplikacja nodejs - połączenie mongodb kończy się niepowodzeniem z błędem ECONNREFUSED