Итак, я создаю приложение для социальных сетей для своего последнего проекта с учебным курсом по программированию. Мы используем MongoDB / Mon goose на бэкэнде, и у меня возникают проблемы с попыткой обновить данные пользователя, когда они меняют свое имя пользователя и имя / фамилию. Их профиль обновляется, их имена в сообщениях обновляются, но их комментарии к сообщениям других людей не обновляются.
Макет на понедельник goose такой ...
Есть коллекция профилей пользователей. Каждая коллекция пользователей имеет коллекции сообщений, если они существуют. У каждого сообщения есть коллекция комментариев, если они существуют.
Когда пользователь меняет свое имя и имя пользователя, я пытаюсь настроить серверную часть для изменения данных во всех своих сообщениях, а также во всех их комментариях (и, в конечном итоге, во всех уведомлениях). Но проблема в том, что пользователь также может комментировать сообщения других людей, поэтому мне также нужно изменить их имя в этих комментариях.
Вот пример кода ...
Контроллер:
update: function (req, res) {
db.User.findOneAndUpdate({ _id: req.params.id }, req.body, {
new: true,
})
.then(function (dbUser) {
//Updates posts from the user specified in params
//with new pic.
return db.Post.update(
{ _id: { $in: dbUser.posts } },
{
username: req.body.slug,
firstName: req.body.firstName,
lastName: req.body.lastName,
},
{ multi: true }
);
})
.then(function (req) {
db.Comment.update(
{ userId: req.body.userId },
{
$set: {
username: req.body.slug,
firstName: req.body.firstName,
lastName: req.body.lastName,
},
},
{ multi: true }
);
})
.then(dbModel => res.json(dbModel))
.catch(err => res.status(422).json(err));
Модели (упрощенные):
const userSchema = new Schema({
username: { type: String, required: true },
//username in lowercase
slug: { type: String, required: true },
firstName: { type: String, required: true },
lastName: { type: String, required: true },
posts: [
{
type: Schema.Types.ObjectId,
ref: 'Post',
},
],
notifications: [
{
type: Schema.Types.ObjectId,
ref: 'Notification',
},
],
})
const postSchema = new Schema({
userId: { type: String, required: true },
username: { type: String, required: true },
firstName: { type: String, required: true },
lastName: String,
postBody: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
comments: [
{
type: Schema.Types.ObjectId,
ref: 'Comment',
},
],
});
const commentSchema = new Schema({
postId: { type: String, required: true },
username: { type: String, required: true },
commentBody: { type: String, required: true },
createdAt: { type: Date, default: Date.now },
firstName: { type: String, required: true },
lastName: String,
userId: { type: String, required: true },
originalPoster: { type: String, required: true },
});
Я считаю, что данные отправляются правильно из внешнего интерфейса, потому что сообщения пользователей обновляются правильно , это просто комментарии в сообщениях, которых нет. Поскольку комментарии представляют собой отдельную коллекцию, я хотел бы написать функцию, которая просматривает каждый комментарий, и если userId = req.body.userId, обновите firstName, lastNa