У меня есть простая функция для сообщений LIKE, на бэкэнде этого веб-приложения.
Я использую .findByIdAndUpdate
для применения двух изменений:
Нажмите user_id в массив post _liked_by
.
Измените свойство likes_count
чтобы отразить обновление.
Я использую модификатор $addToSet
, чтобы нажать user_id
на массив post _liked_by
чтобы избежать user_id
дважды.
Но если я просто увеличиваю значение likes_count
, функция фактически увеличит его, даже если user_id
уже присутствует в массиве _liked_by
и массив остался с тем же размером.
Есть ли способ передать _liked_by
массива _liked_by
элегантным способом как значение свойства likes_count
?
Вот код:
Post.findByIdAndUpdate({
_id: post_id
}, {
$addToSet: {
_liked_by: user_id
},
// I'd like to have something like...
$set: {
likes_count: _liked_by.length
// ...as If it reads the actual length after the previous $addToSet
// Is there an option to do something similar?
}
}, {
new: true
})
.then((updated_post) => {
res.status(200).json({
message: "Post has been liked Successflly!",
post: updated_post
});
})
.catch((err) => {
res.status(500).json({
message: "something went wrong | internal server error ",
err
});
});
};
Отфильтруйте массив _liked_by
в части запроса фильтра (запроса), а не с помощью $addToSet
а затем вы можете использовать $inc
здесь для увеличения массива _liked_by
на 1
Post.findByIdAndUpdate(
{ "_id": post_id, "_liked_by": { "$ne": user_id } },
{
"$addToSet": { "_liked_by": user_id },
"$inc": { "likes_count": 1 }
},
{ "new": true }
)
И вы также можете использовать $push
потому что мы делаем фильтрацию в части запроса
Post.findByIdAndUpdate(
{ "_id": post_id, "_liked_by": { "$ne": user_id } },
{
"$push": { "_liked_by": user_id },
"$inc": { "likes_count": 1 }
},
{ "new": true }
)