Как сослаться на документ внутри коллекции в MongoDB

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

{
    postId: '232323',
    byUser: 'userid1',
    post: 'This is my first post',
        commentsOnPost: [
            {
                commentId: '232323_8888',
                byUser: 'userid2',
            comment: 'Congrats',
                repliesOnPost: [
                    {
                        replyId: '232323_8888_66666',
                        byUser: 'userid1',
                    reply: 'Thanks',
                        likesOnReplyBy: ['userid1', 'userid5', 'userid3'],

                    },
                    {
                        replyId: '232323_8888_55555',
                        byUser: 'user2',
                    reply: 'Welcome',
                        likesOnReplyBy: ['userid6', 'userid8', 'userid9'],

                    }
                ]
            }
        ]
}

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

[
 {
  userid:userid1,
  displayName:'Bob',
  profilePic:'https://example.com/bob_profile.png'
 },

 {
  userid:userid2,
  displayName:'Lorish',
  profilePic:'https://example.com/lorish_profile.png'
 }

.
.
.
.

]

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

Ожидаемый результат

{
    postId:'232323',
    byUser: {
     userid:userid2,
     displayName:'Lorish',
     profilePic:'https://example.com/lorish_profile.png'
    }
    post:'This is my first post',
    commentsOnPost:[
        {
            commentId:'232323_8888',
            byUser: {
             userid:userid1,
             displayName:'Bob',
             profilePic:'https://example.com/lorish_profile.png'
            },
            comment:'Congrats',
            repliesOnPost:[
                {
                    replyId:'232323_8888_66666',
                    byUser: {
                      userid:userid1,
                      displayName:'Bob',
                      profilePic:'https://example.com/lorish_profile.png'
                    },
                    reply:'Thanks',
                    likesOnReplyBy:[
                    {
                         userid:userid6,
                         displayName:'Kiti',
                         profilePic:'https://example.com/lorish_profile.png'
                     },
                     {
                         userid:userid2,
                         displayName:'Lorish',
                         profilePic:'https://example.com/lorish_profile.png'
                     }

                  ],
                    
                },
                {
                    replyId:'232323_8888_55555',
                    byUser: {
                       userid:userid2,
                       displayName:'Lorish',
                       profilePic:'https://example.com/lorish_profile.png'
                     },
                    reply:'Welcome',
                    likesOnReplyBy:[
                        {
                         userid:userid5,
                         displayName:'Rahul',
                         profilePic:'https://example.com/lorish_profile.png'
                        }
                    ],
                    
                }
            ]
        }
    ]
}

person Deepak    schedule 12.07.2021    source источник
comment
Отвечает ли это на ваш вопрос? Ссылка на другую схему в Mongoose   -  person jatinder bhola    schedule 12.07.2021
comment
Я устал от драйвера мангуста, за которым вы можете следить с помощью stackoverflow.com/a/18002078/1964336 или учиться у mongodb документы docs.mongodb.com/manual/reference/database-references   -  person jatinder bhola    schedule 12.07.2021
comment
Я не использую мангуст. Я использую собственный драйвер NodeJS для MongoDB.   -  person Deepak    schedule 12.07.2021
comment
вы можете использовать запрос агрегации, но это долгий процесс. деконструировать массив комментариев и оснований, а затем искать в пользовательской коллекции, снова восстанавливать массив ответов и комментариев. Я бы не рекомендовал этот способ, он не будет работать хорошо. есть 2 варианта: 1) получить список пользователей, когда отображаются комментарии и ответы, просто возьмите информацию о пользователе из этого списка, вы можете сделать его как объект пары ключ-значение, чтобы его можно было легко получить по его идентификатору пользователя.   -  person turivishal    schedule 12.07.2021
comment
2) в то время как mongodb - это nosql, в вашем случае соединение обходится дороже, поэтому в соответствии с mongodb можно хранить дубликаты данных, но по возможности избегать соединений, поэтому вы можете просто хранить информацию о пользователе в комментариях и ответах, вам не нужно присоединиться из любого места.   -  person turivishal    schedule 12.07.2021
comment
Я могу хранить информацию о пользователе везде, где появляется идентификатор пользователя, но что, если сообщение станет старше, и пользователь изменит свое отображаемое имя или изображение профиля !! он покажет старое имя или изображение профиля. Я думаю, это не нормально.   -  person Deepak    schedule 12.07.2021
comment
вы можете синхронизировать информацию после определенного периода времени.   -  person turivishal    schedule 12.07.2021
comment
@Deepak Не могли бы вы поделиться, как будет выглядеть окончательный результат?   -  person Jits    schedule 15.07.2021
comment
@Jits добавил ожидаемый результат.   -  person Deepak    schedule 16.07.2021
comment
Вы могли бы использовать что-то вроде этого. mongoplayground.net/p/CSsjYnON9Za. Использование раскрутки для добавления информации о пользователе в определенные структуры и их повторной группировки. Однако я думаю, что будет проще, если вы просто сделаете еще один запрос для пользователей и отобразите эти данные.   -  person Rubén Vega    schedule 19.07.2021
comment
@Ruby Vega Я ценю вашу работу, но она не работает, когда комментарии или ответы пусты.   -  person Deepak    schedule 19.07.2021
comment
Не могли бы вы добавить несколько примеров этих неудач?   -  person Rubén Vega    schedule 20.07.2021
comment
Просто возьмите пустой массив для комментариев по записи или ответов по комментариям. mongoplayground.net/p/KnjyWIb5Uzs   -  person Deepak    schedule 20.07.2021
comment
Вам просто нужно добавить оператор на этапе $unwind, чтобы сохранить нулевые и пустые значения. mongoplayground.net/p/5_wlr02WjIh   -  person Rubén Vega    schedule 20.07.2021
comment
@Рубен Вега Отлично!! Это работает нормально. Просто хочу знать проблему с производительностью. Вы сказали для сопоставления пользователей после получения данных. Для этого мне нужно применить 3 цикла с поиском в БД. Это нормально? Какой из них должен быть лучшим в этом случае?   -  person Deepak    schedule 20.07.2021
comment
@Deepak Я не эксперт в области производительности .... Однако я думаю, что лучшее решение будет зависеть от того, чего вы хотите. При выполнении этого запроса вычислительная работа будет выполняться на стороне сервера mongoDB. Если вы выполняете оба запроса по отдельности и объединяете их в своем приложении, работа будет разделена. Какое лучшее решение? как я уже сказал, это зависит, простой пример: если этот запрос сделан со многих мобильных устройств в вашем клиентском приложении, может быть, лучше обработать его там. потому что каждое из N устройств обработает его 1 раз, а не ваш сервер обработает его N раз.   -  person Rubén Vega    schedule 21.07.2021
comment
Спасибо! Вы можете оставлять свои комментарии в качестве ответа. Я приму это.   -  person Deepak    schedule 21.07.2021