Объединение нескольких типов документов существует в одной коллекции / контейнере MongoDB

#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. Отредактировал свой ответ с помощью самостоятельного поиска!