【发布时间】:2018-12-30 03:38:40
【问题描述】:
所以我有事件对象,它有 cmets,而 cmets 有喜欢数组。 我目前可以做的是将like添加到事件对象的cmets数组中。
我的架构与此类似:
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'
}
}
]
}
]
}
而我当前对 cmets 的添加喜欢功能如下所示:
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,但它删除了整个事件对象。
【问题讨论】:
-
也许您可以将喜欢的内容保存为 user_id,并且每当有人不喜欢时,都会返回该 user_id 的新过滤数组。我认为它可能更简单
-
你能跟进更多吗?我不确定我是否得到你
-
如果您将喜欢的内容保存为简单的 user_id 数组,例如
[1,2,3...],那么,假设用户在不喜欢时已登录,您可以过滤喜欢的数组,例如likesArray = likesArray.filter(id => user.id !== id),然后在找到该事件时,更新使用$set{'comment.likes': likesArray}。希望它有意义并有所帮助 -
设法“使用拉操作员将其拉下”
标签: javascript node.js mongodb mongoose