Настройка сложной модели комментариев в NodeJS и mongoose

#node.js #mongodb #mongoose

#node.js #mongodb #mongoose

Вопрос:

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

Как я должен настроить свою модель, чтобы иметь возможность фиксировать эти данные в моем ответе?

кроме того, любые другие предложения будут оценены

Вот модель, которую я сейчас настраиваю

 const mongoose = require('mongoose')

const commentSchema = new mongoose.Schema({
    owner: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: 'User'
    },
    reference: {
        type: mongoose.Schema.Types.ObjectId,
        required: false,
        ref: 'Project' || null,
        default: false
    },
    body: {
        type: String,
        required: true,
        trim: true
    },
    reply: {
        owner: {
            type: mongoose.Schema.Types.ObjectId,
            required: false,
            ref: 'User'
        },
        body: {
            type: String,
            required: true
        }
    }
}, {
    timestamps: true
})

const Comment = mongoose.model('Comment', commentSchema)

module.exports = Comment

 

Ответ №1:

Если вы думаете о модели, в которой мы имеем

 some post
>commentA
  >replyA-a
    >replyA-a-a
      >replyA-a-a-a
  >replyA-b
>commentB
>commentC
 

Я бы объединил все для соответствующего объекта

 Comment {
  user,
  body,
  replies: [Comment] // pattern composite
}
EntityComment { // only persist this one
  reference: { id, type: post|topic|whatever },
  comment: [Comment]
}
 

Реквизит:

  • an entityComment может стать большим (это проблематично?)
  • нет необходимости в многократной выборке, все есть
  • легко «скрыть» некоторые комментарии и просто показать их количество (длину массива)

Если запись entityComment становится слишком большой (максимальная длина записи, по-видимому, составляет 16 МБ, что, вероятно, не является пределом, но, возможно, полезная нагрузка загружается медленно), то

  1. мы можем подумать о сохранении каждого комментария (используя ответы : [{ ref: Comment, type: ObjectId)}] )
  2. но, возможно, лучшей идеей будет использовать ссылку для body ( body: [ref: CommentBody, type: ObjectId] )

Причина body , вероятно, в виновнике (с точки зрения размера данных), и это позволило бы

  • сохраняйте все вложенным в entityComment
  • задержка выборки интересующих нас тел (не всей иерархии)

Есть компромиссы:

  1. подходит для чтения
  2. проще для записи (просто обновите / удалите отдельный комментарий)