MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Получаване на предци в MongoDb с помощта на дървовидна структура

Това е non-trivial решение.

ИЗИСКВАНИЯ

1 Трябва да добавим допълнително поле (нека го наречем level ), което показва къде се намира документът в йерархията.

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

2 Трябва да define предишна дълбочина на йерархията (например:максимум 3)

ОГРАНИЧЕНИЕ

За да филтрираме от конкретно ниво, трябва да променим root и children $match стойности.

Осигурете винаги йерархично ниво:

root     - 0
children - 1

root     - 1
children - 2  

РЕШЕНИЕ

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 (макс. дълбочина:3) | MongoPlayground (макс. дълбочина:4)

ОБЯСНЕНИЕ

  1. С $facet ние определяме структура на ниво. root само цялата основна директория. children съдържа всички деца с ниво 1 + деца потомци.

  2. Ние $filter (сливане) root и деца от parentId

  3. С $project и $replaceRoot връщаме оригиналната структура.

ВРЪЗКИ

https://docs.mongodb.com/manual/reference/operator/ агрегиране/фасет/
https://docs.mongodb.com/manual/ справка/оператор/агрегация/филтър/
https://docs.mongodb.com/manual/ reference/operator/aggregation/replaceRoot/




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo индекс за период от време с филтри

  2. Защо MongoDb сортирането е бавно с колекции за търсене

  3. Драйвер на MongoDB Java:филтрирайте по id

  4. MongoDb :Намерете общ елемент от два масива в рамките на заявка

  5. пуснете цялата база данни в рамките на една команда за възстановяване на дъмпа на mongodb