Javascript mongodb/mongoose findOneandUpdate如何获取索引和删除对象
所以我有一个事件对象,它有注释,注释有一个数组。 我目前可以做的是将like添加到事件对象的comments数组中 我的模式与此类似:Javascript mongodb/mongoose findOneandUpdate如何获取索引和删除对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,所以我有一个事件对象,它有注释,注释有一个数组。 我目前可以做的是将like添加到事件对象的comments数组中 我的模式与此类似: creator: { type: Schema.Types.ObjectId, ref: 'User' }, comments: [ { user: { type: Schema.Types.ObjectId, ref: 'User' }, text: {
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);
}
);
}
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);
}
);
}
参数:idas-事件。\u id,commentID:comment id,id:user.\u id
问题是,我可以添加无尽的喜欢,因为我没有逻辑操作来检查用户是否已经喜欢它,而且我真的在这个findoneandupdate函数中挣扎着去做。但这就是问题所在,我想做的另一件事与评论不同,我正在努力弄清楚,如何从likes数组中获取用户索引,这样我就可以切掉索引,目前我的函数如下所示:
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);
}
);
}
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,但它删除了整个事件对象。所以我通过使用pull操作符成功地删除了它。 工作删除注释类功能
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);
}
);
}
};
也许您可以将喜欢的内容保存为用户id,并且每当有人取消链接时,都会返回一个由该用户id过滤的新数组。我认为这可能会更简单。您可以进一步了解这一点吗?我不确定我是否得到了你,如果你将你的喜好保存为一个简单的用户id数组,例如
[1,2,3…]
,那么,假设一个用户在取消链接时登录,你可以过滤的是喜好数组,例如likesArray=likesArray.filter(id=>user.id!==id)
,然后在找到该事件时,更新use$set{'comment.likes':likesArray}
。希望它有意义并有助于使用pull操作符工具“完成”,忘记了$pull