sql >> Database >  >> NoSQL >> MongoDB

Voorouders in MongoDb ophalen met behulp van de boomstructuur

Het is non-trivial oplossing.

VEREISTEN

1 We moeten een extra veld toevoegen (laten we het level noemen) ) die aangeeft waar het document zich binnen de hiërarchie bevindt.

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

2 We moeten define eerder hiërarchiediepte (bijvoorbeeld:max 3)

BEPERKING

Om vanaf een specifiek niveau te filteren, moeten we root wijzigen en children $match waarden.

Zorg altijd voor hiërarchieniveau:

root     - 0
children - 1

root     - 1
children - 2  

OPLOSSING

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

UITLEG

  1. Met $facet we definiëren niveaustructuur. root alleen alle hoofddirectory's. children bevat alle kinderen met niveau 1 + kinderen afstammelingen.

  2. Wij $filter (samenvoegen) root en kinderen door parentId

  3. Met $project en $replaceRoot we geven de originele structuur terug.

LINKS

https://docs.mongodb.com/manual/reference/operator/ aggregatie/facet/
https://docs.mongodb.com/manual/ referentie/operator/aggregatie/filter/
https://docs.mongodb.com/manual/ reference/operator/aggregation/replaceRoot/




  1. Waarom zou ik Redis gebruiken als ik PostgreSQL als mijn database voor Django heb?

  2. mongodb haalt het hele document uit een waarde

  3. Volledige tekst zoekopties voor MongoDB setup

  4. Wat is er aan de hand met Meteor en Fibers/bindEnvironment()?