MongoDb $ graphLookup получает root в результате - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующая коллекция

[
    {
      "_id": "1",
      "name": "A",
      "parent": "",

    },
    {
      "_id": "2",
      "name": "B",
      "parent": "A",

    },
    {
      "_id": "3",
      "name": "C",
      "parent": "B",

    },
    {
      "_id": "4",
      "name": "D",
      "parent": "C",

    }
  ]

Я пытаюсь получить ответ, подобный этому:

[
  {
    "_id": "4",
    "name": "D",
    "parent": "C"
  },
  {
    "_id": "3",
    "name": "C",
    "parent": "B"
  },
  {
    "_id": "2",
    "name": "B",
    "parent": "A"
  },
  {
    "_id": "1",
    "name": "A",
    "parent": ""
  }
]

Я пробовал несколько вещей, но застрял, последняя попытка :

db.collection.aggregate([
  {
    "$match": {
      "name": "D"
    }
  },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$parent",
      connectFromField: "parent",
      connectToField: "name",
      as: "chain"
    }
  },
  {
    $facet: {
      "chain": [
        {
          $project: {
            "chain": 1,
            "_id": 0
          }
        },

      ],
      "root": [
        {
          $project: {
            "chain": 0
          }
        },

      ]
    },

  },
  {
    $unwind: "$chain"
  },
  {
    $unwind: "$root"
  }
])

Результат от моей попытки:

[
  {
    "chain": {
      "chain": [
        {
          "_id": "1",
          "name": "A",
          "parent": ""
        },
        {
          "_id": "3",
          "name": "C",
          "parent": "B"
        },
        {
          "_id": "2",
          "name": "B",
          "parent": "A"
        }
      ]
    },
    "root": {
      "_id": "4",
      "name": "D",
      "parent": "C"
    }
  }
]

Я хотел бы pu sh этот элемент "root" в массиве цепочек и сделать этот массив верхний результат, а затем сортировать его. В моем реальном случае использования "parent" и "name" - это просто некоторые идентификаторы, поэтому я не могу просто отсортировать по алфавиту (я бы назвал это по номеру java, чтобы потом можно было выполнить сортировку там, если это невозможно из mon go).

Я пытался использовать $ pu sh в проекции для их объединения, но согласно документации, которая не работает, $ pu sh работает только в группе $, если Я понял это правильно.

...