Я пытаюсь смоделировать конструкцию для моего нового проекта. Я родом из базы реляционных баз данных и пытаюсь понять, как лучше всего моделировать отношения, где, например, сообщение может иметь много тегов. У меня есть следующие варианты использования:
- Пользователь может создавать / редактировать сообщения
- При создании / редактировании поста пользователь может искать существующие теги или добавлять новые
- Пользователь может видеть каждый связанный тег при просмотре сообщения
- Пользователь может видеть каждый связанный пост при просмотре тега
То, что я получил до сих пор, это следующие модели
const PostSchema = new Schema({
post: String,
tags: [{
type: Schema.Types.ObjectId,
ref: 'Tag'
}],
updated: {
type: Date,
default: Date.now
}
});
const TagSchema = new Schema({
name: {
type: String,
unique: true,
required: true
},
updated: {
type: Date,
default: Date.now
}
});
Вопрос 1 : Подойдет ли это для моего варианта использования?
Плюсы, которые я вижу, в том, что я могу легко искать теги новостей, используя модель тегов, и что каждый тег уникален. Проблема, с которой я столкнулся, заключается в том, что я не совсем уверен, как обрабатывать запрос, когда пользователь создает / обновляет сообщение.
В настоящее время в моем сообщении используется следующая логика # create endpoint
Post.create(req.body, (err, text) => {
if (err) {
res.send({ 'error': 'An error has occurred' });
} else {
const newTags = req.body.tags.filter(tag => tag._id === undefined && tag.name);
Tag.init().then(() => {
Tag.create(newTags.map(tag => tag.name), (err, tags) => {
tags.forEach(tag => { text.tags.push(tag) });
text.save();
})
});
res.send(text);
}
});
Тело запроса на этой конечной точке может выглядеть примерно так:
{
"post": "Post message",
"tags": [
{ "_id": "1234" }, // Existing tag
{ "name": "my tag" } // New tag
]
}
Вопрос 2 : Есть ли какой-нибудь лучший / более простой способ добиться этого, чем приведенный выше код?