Как запросить иерархические данные, которые основаны не на идентификаторах документов, а на другом свойстве - PullRequest
0 голосов
/ 17 октября 2018

Допустим, у меня иерархическая структура комментариев:запросите иерархию на основе корневого ContentId следующим образом:

getCommentsTree(rootContentId) { … }
var comments = getCommentsTree(1);

1 Ответ

0 голосов
/ 17 октября 2018

Ссылки: https://docs.mongodb.com/manual/tutorial/model-tree-structures-with-parent-references/index.html и https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/#pipe._S_graphLookup.

Идея состоит в том, чтобы отфильтровать (оператор match) запрошенный документ, а затем использовать агрегатную функцию graphLookup (проверить все ограничения, например, max memory)

db.getCollection('comments').aggregate([
{
    $match : { "ContentId" : 1.0 } 
},
{
   $graphLookup: {
      from: 'comments',
      startWith: "$ContentId",
      connectFromField: "ContentId",
      connectToField: "ParentContentId",
      as: "hierarchy"
   }
}])

Это вернет объект, который соответствует добавленному массиву иерархии, показывая всех потомков, что-то вроде этого:

...
"hierarchy" : [ 
    {
        "id" : 3,
        "type" : "added",
        "text" : "c3",
        "parentId" : 1
    }, 
    {
        "id" : 4,
        "type" : "added",
        "text" : "c4",
        "parentId" : 3
    }, 
    {
        "id" : 2,
        "type" : "added",
        "text" : "c2",
        "parentId" : 1
    }
]

...
"hierarchy" : [ 
    {
        "id" : 3,
        "type" : "added",
        "text" : "c3",
        "parentId" : 1
    }, 
    {
        "id" : 4,
        "type" : "added",
        "text" : "c4",
        "parentId" : 3
    }, 
    {
        "id" : 2,
        "type" : "added",
        "text" : "c2",
        "parentId" : 1
    }
]

Вы должны посмотретьна https://docs.mongodb.com/manual/applications/data-models-tree-structures/, чтобы увидеть, будут ли другие методы моделирования лучше для вашего сценария.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...