Mongodb Агрегированные документы во вложенной иерархии - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь объединить документы в коллекции во вложенный график. Ниже приведен пример данных из приложения магазина комментариев, с которым я работаю -

Коллекция сообщений:

{ 
    "_id" : "1", 
    "text" : "hey", 
}
{ 
    "_id" : "2", 
    "text" : "hello", 
    "replyTo" : "1"
}
{ 
    "_id" : "3", 
    "text" : "What's up?", 
    "replyTo" : "2"
}
{ 
    "_id" : "4", 
    "text" : "How are you", 
    "replyTo" : "1"
}

{ 
    "_id" : "5", 
    "text" : "Knock, knock!", 
}

Ожидаемый результат должен выглядеть следующим образом:

{
   "_id": "1",
   "text": "hey",
   "replies": [
      {
         "_id": "2",
         "text": "hello",
         "replyTo": "1",
         "replies": [
            {
               "_id": "3",
               "text": "What's up?",
               "replyTo": "2"
            }
         ]
      },
      {
         "_id": "4",
         "text": "How are you",
         "replyTo": "1"
      }
   ]
}

{ 
    "_id" : "5", 
    "text" : "Knock, knock!", 
}

Я пробовал $ graphLookup, который рекурсивно обрабатывает документы, но в результате получается плоский массив, который не соответствует ожиданиям -

db.posts.aggregate(
    [
        { 
            "$graphLookup" : {
                "from" : "posts", 
                "startWith" : "$_id", 
                "connectFromField" : "_id", 
                "connectToField" : "replyTo", 
                "as" : "replies"
            }
        }
    ], 
    { 
        "allowDiskUse" : false
    }
);

Результат:

{ 
    "_id" : "1", 
    "text" : "hey", 
    "slug_path" : "1", 
    "replies" : [
        {
            "_id" : "2", 
            "text" : "hello", 
            "slug_path" : "1/2", 
            "replyTo" : "1"
        }, 
        {
            "_id" : "4", 
            "text" : "How are you", 
            "slug_path" : "1/4", 
            "replyTo" : "1"
        }, 
        {
            "_id" : "3", 
            "text" : "what's up?", 
            "slug_path" : "1/2/3", 
            "replyTo" : "2"
        }
    ]
}
{ 
    "_id" : "2", 
    "text" : "hello", 
    "slug_path" : "1/2", 
    "replyTo" : "1", 
    "replies" : [
        {
            "_id" : "3", 
            "text" : "what's up?", 
            "slug_path" : "1/2/3", 
            "replyTo" : "2"
        }
    ]
}
{ 
    "_id" : "4", 
    "text" : "How are you", 
    "slug_path" : "1/4", 
    "replyTo" : "1", 
    "replies" : [

    ]
}
{ 
    "_id" : "3", 
    "text" : "what's up?", 
    "slug_path" : "1/2/3", 
    "replyTo" : "2", 
    "replies" : [

    ]
}
{ 
    "_id" : "5", 
    "text" : "Knock, knock!", 
    "replies" : [

    ]`
}

Есть ли способ, которым я могу достичь того типа агрегации, который я ожидаю?

Спасибо Davinder

1 Ответ

0 голосов
/ 05 мая 2018

Я закончил тем, что отказался от $ graphLookup, так как он может дать только одноуровневые родительско-дочерние отношения и не может рекурсивно создать древовидную структуру в качестве результата. Мне удалось полностью создать древовидную структуру в Java, и программа работает быстро с точки зрения производительности.

...