#mongodb
Вопрос:
Пожалуйста, рассмотрите следующую модель данных, в которой она предназначена для помещения нескольких типов документов в одну разделенную коллекцию или контейнер MongoDB. post_comment_reaction_combined_коллекция
{
"id": "<post-id>",
"type": "post",
"postId": "<post-id>",
"userId": "<post-author-id>",
"title": "<post-title>",
"content": "<post-content>",
"creationDate": "<post-creation-date>"
}
{
"id": "<comment-id>",
"type": "comment",
"postId": "<post-id>",
"userId": "<comment-author-id>",
"content": "<comment-content>",
"creationDate": "<comment-creation-date>"
}
{
"id": "<like-id>",
"type": "like",
"postId": "<post-id>",
"userId": "<liker-id>",
"creationDate": "<like-creation-date>"
}
У нас есть требование объединить / объединить эти типы документов, чтобы обеспечить следующий вывод.
Пример Ввода —
{
"id": "post-id",
"type": "post",
"postId": "post-id",
"userId": "post-author-id-1",
"title": "post-title",
"content": "post-content"
}
{
"id": "comment-id-1",
"type": "comment",
"postId": "post-id",
"userId": "comment-author-id-1",
"content": "comment-content-1"
}
{
"id": "comment-id-2",
"type": "comment",
"postId": "post-id",
"userId": "comment-author-id-2",
"content": "comment-content-2"
}
{
"id": "comment-id-3",
"type": "comment",
"postId": "post-id",
"userId": "comment-author-id-3",
"content": "comment-content-"
}
Пример Вывода —
{
"id": "post-id",
"type": "post",
"postId": "post-id",
"userId": "post-author-id-1",
"title": "post-title",
"content": "post-content"
"comments": [
{
"id": "comment-id-1", ….
} ,
{
"id": "comment-id-2", ….
},
{
"id": "comment-id-3", ….
}
],
"totalCommentCount": 3
}
Можно ли эффективно выполнить вышеуказанное преобразование в одном запросе или конвейере агрегации в MongoDB? Я также хотел бы сравнить один контейнер, имеющий разные типы и имеющий отдельный контейнер для моделирования данных каждого типа, каковы плюсы и минусы, будут ли проблемы масштабируемости при сегментировании?
Ответ №1:
вы можете обратиться к https://mongoplayground.net/p/P1agbem4xgY
совокупный код:
db.post.aggregate([
{
"$lookup": {
"from": "comments",
"localField": "id",
"foreignField": "postId",
"as": "comments"
}
}
])
здесь мы выполняем поиск с комментариями на основе postid
Поскольку у вас есть все документы в одной коллекции, вы можете рассмотреть возможность использования ниже(самостоятельный поиск!) https://mongoplayground.net/p/wVGUL2b18fn
db.post_comments.aggregate([
{
"$lookup": {
"from": "post_comments",
"localField": "id",
"foreignField": "postId",
"as": "comments"
}
}
])
Комментарии:
1. Как я уже упоминал, он предназначен для помещения нескольких типов документов в одну разделенную коллекцию или контейнер MongoDB. Это означает, что типы документов Post, Comment, Reaction помещаются в одну коллекцию, она не предназначена для отдельного создания коллекций для сообщений, комментариев и т. Д. — Коллекция Постов, Коллекция Комментариев. Мы не можем использовать $lookup здесь, так как документы комментариев также разделены.
2. Отредактировал свой ответ с помощью самостоятельного поиска!