#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 МБ, что, вероятно, не является пределом, но, возможно, полезная нагрузка загружается медленно), то
- мы можем подумать о сохранении каждого комментария (используя ответы :
[{ ref: Comment, type: ObjectId)}]
) - но, возможно, лучшей идеей будет использовать ссылку для body (
body: [ref: CommentBody, type: ObjectId]
)
Причина body
, вероятно, в виновнике (с точки зрения размера данных), и это позволило бы
- сохраняйте все вложенным в
entityComment
- задержка выборки интересующих нас тел (не всей иерархии)
Есть компромиссы:
- подходит для чтения
- проще для записи (просто обновите / удалите отдельный комментарий)