sql >> Database teknologi >  >> NoSQL >> MongoDB

Få forfædre i MongoDb ved hjælp af træstruktur

Det er non-trivial løsning.

KRAV

1 Vi skal tilføje ekstra felt (lad os kalde det level ) som angiver, hvor dokumentet er placeret inde i hierarki.

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

2 Vi skal define tidligere hierarkidybde (for eksempel:maks. 3)

BEGRÆNSNING

For at filtrere fra et specifikt niveau, skal vi ændre root og children $match værdier.

Sørg for altid hierarkiniveau:

root     - 0
children - 1

root     - 1
children - 2  

LØSNING

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 (max dybde:3) | MongoPlayground (maks. dybde:4)

FORKLARING

  1. Med $facet vi definerer niveaustruktur. root kun alle rodmapper. children indeholder alle børn med niveau 1 + børn efterkommere.

  2. Vi $filter (flet) rod og børn med parentId

  3. Med $project og $replaceRoot vi returnerer den oprindelige struktur.

LINKS

https://docs.mongodb.com/manual/reference/operator/ aggregering/facet/
https://docs.mongodb.com/manual/ reference/operatør/aggregation/filter/
https://docs.mongodb.com/manual/ reference/operatør/aggregation/replaceRoot/




  1. Flask MongoEngine sideinddelte dokumenter med billedfelt

  2. MongoDB $gruppe og eksplicit gruppedannelse med beregnet kolonne

  3. Er master altid omdisponeret instans med mindste prioritet?

  4. mongoDB, kunne ikke læse fra config-filen -- config i anden mappe / afinstallere den?