javascript - mongodb/mongoose findOneandUpdate 如何获取索引和删除对象
问题描述
所以我有事件对象,它有评论,评论有喜欢数组。我目前可以做的是将喜欢添加到事件对象的评论数组中。
我的架构与此类似:
creator: {
type: Schema.Types.ObjectId,
ref: 'User'
},
comments: [
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
},
text: {
type: String,
required: true
},
likes: [
{
user: {
type: Schema.Types.ObjectId,
ref: 'User'
}
}
]
}
]
}
我当前的添加评论功能如下所示:
commentLike: async (req, res) => {
console.log('working', req.params.id, req.params.idas, req.params.commentID);
Events.findOneAndUpdate(
{ _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
{ $push: { 'comments.$.likes': { user: req.params.id } } },
(result) => {
res.json(result);
}
);
}
参数:idas-event._id,commentID:评论 id,id:user._id
问题是我可以添加无尽的喜欢,因为我没有逻辑操作来检查用户是否已经喜欢它,而且我真的很挣扎,在这个 findoneandupdate 函数中做到这一点。但这就是问题所在,我想做的另一件事与评论不同,我很难弄清楚如何从喜欢数组中获取用户索引,以便我可以切出该索引,目前我的函数看起来像这样:
deleteLike: async (req, res) => {
console.log('working', req.params.id, req.params.idas, req.params.commentID);
Events.findOneAndUpdate(
{ _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
{
$push: {
'comments.$.likes': {
$each: [],
$slice: 0 //there instead of 0 should be user index
}
}
},
(result) => {
res.json(result);
}
);
}
在这个函数上我也使用 findoneandupdate 函数,这可能不是一个好主意?试图使用 findandremove,但它删除了整个事件对象。
解决方案
所以我设法通过使用拉操作符来做到这一点。工作删除评论之类的功能
deleteLike: async (req, res) => {
console.log('working', req.params.id, req.params.idas, req.params.commentID);
Events.findOneAndUpdate(
{ _id: req.params.idas, comments: { $elemMatch: { _id: req.params.commentID } } },
{
$pull: { 'comments.$.likes': { user: req.params.id } }
},
(result) => {
res.json(result);
}
);
}
};
推荐阅读
- kubernetes - k8s 中的 TLS 引导节点
- python - 需要一些帮助来理解作为函数的参数
- c++ - 如何在 C++ 中使用数学
- android - android studio:模拟器不能多次启动
- c - 我似乎无法理解如何将我的 scanf 限制为仅浮点数
- database - 从数据库中获取大字符串
- apache-spark - Spark 指标接收器不公开执行者的指标
- keycloak - 如何使用 URL 传递 keycloak 登录页面语言
- react-native - 链接 openURL 无法从 json 数据中读取值
- smartscreen - 避免 SmartScreen 警告