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

Pozyskiwanie przodków w MongoDb przy użyciu struktury drzewa

To jest non-trivial rozwiązanie.

WYMAGANIA

1 Musimy dodać dodatkowe pole (nazwijmy to level ), który wskazuje, gdzie w hierarchii znajduje się dokument.

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

2 Musimy define poprzednio głębokość hierarchii (na przykład:max 3)

OGRANICZENIE

Aby filtrować z określonego poziomu, musimy zmodyfikować root i children $match wartości.

Upewnij się, że zawsze poziom hierarchii:

root     - 0
children - 1

root     - 1
children - 2  

ROZWIĄZANIE

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 (maksymalna głębokość:3) | MongoPlayground (maksymalna głębokość:4)

WYJAŚNIENIE

  1. Z $facet definiujemy strukturę poziomów. root tylko katalog główny. children zawiera wszystkie dzieci z poziomem 1 + dzieci potomków.

  2. My $filter (Scal) root i dzieci według parentId

  3. Z $project i $replaceRoot zwracamy oryginalną strukturę.

LINKI

https://docs.mongodb.com/manual/reference/operator/ agregacja/aspekt/
https://docs.mongodb.com/manual/ referencja/operator/agregacja/filtr/
https://docs.mongodb.com/manual/ referencja/operator/agregacja/replaceRoot/




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. $pull . MongoDB

  2. Dane dotyczące przyłączania się do Mongoose

  3. Bezagentowe monitorowanie bazy danych za pomocą ClusterControl

  4. Nie można używać Linq z zagnieżdżoną klasą List<> w MongoDb C#

  5. mongodb zastosuj sortowanie do wyników wyszukiwania