gpt4 book ai didi

javascript - findOneAndRemove 和 findOneAndUpdate 未按预期工作

转载 作者:行者123 更新时间:2023-11-30 12:22:56 26 4
gpt4 key购买 nike

我正在尝试像在 Facebook 中那样进行“喜欢”切换。

当没有以前的“喜欢”时,我的代码工作正常。

并且当只有一个“喜欢”时也会删除查找。

但当有很多点赞时,它就开始成为问题。

因为我喜欢不同的帖子,

enter image description here

它添加了正确的引用

enter image description here

我又加了一个

enter image description here

这就是问题所在 - 我实际上按下了第三个的切换按钮,但结果不同。最上面的那个被删除了。

我使用 Mongoose Schemas 制作的模型如下:

var postSchema  = new Schema({
title: {type:String},
content: {type:String},
likeId:[{type:Schema.ObjectId, ref:'Like'}],
user:{type:Schema.ObjectId},
commentId:[{type:Schema.ObjectId, ref:'Comment'}],
created:{type:Date, default:Date.now}
});

var likeSchema = new Schema({
user: Schema.ObjectId,
postId: {type:Schema.ObjectId, ref:'Post'},
created:{type:Date, default:Date.now}
});

没有中间件。

这是我的应用程序的 Controller 部分:

exports.postLikes = function(req,res){
var like = new Like({
postId: req.params.postId,
user: req.user._id
});
Like.find()
// find like "to the post" and "by the user"
.and([
{user:req.user._id},
{postId:req.params.postId}
])
//and then execute the following
.exec(function(err, result){
//if it exists, return "result"
if(result.length > 0){
//remove the result by result.id
Like.findOneAndRemove(result[0]._id, function(err){
//pull off the reference from likeId array in Post
Post.findOneAndUpdate({'_id':req.params.postId}, {$pull:{'likeId':result[0]._id}}, function(err){
if(err){res.send(err);}
res.json({status:'deleted'});
});
});
}
else{
like.save(function(err){
if(err){res.send(err);}
Post.findById(req.params.postId, function(err,post){
if(err) return res.send(err);
post.likeId.push(like);
post.save(function(err){
if(err) return res.send(err);
res.json({status:'done'});
});
});
});
};
});
};

请原谅我乱七八糟的代码。

我已经连续两天尝试让它正常工作,但找不到方法。帮帮我:(


我使用的数据是:

“喜欢”JSON 对象数组

(点赞数据已经删除,所以我重新做了)

/* 0 */
{
"_id" : ObjectId("5560de9f9c93fb28161a7375"),
"postId" : ObjectId("5560d511cae220180c37f9d3"),
"user" : ObjectId("5560daf3a09140800bb70a41"),
"created" : ISODate("2015-05-23T20:10:07.002Z"),
"__v" : 0
}

/* 1 */
{
"_id" : ObjectId("5560e7c98d6e3fbc15999daa"),
"postId" : ObjectId("5560d514cae220180c37f9d4"),
"user" : ObjectId("5560daf3a09140800bb70a41"),
"created" : ISODate("2015-05-23T20:49:13.867Z"),
"__v" : 0
}

/* 2 */
{
"_id" : ObjectId("5560e7d78d6e3fbc15999dab"),
"postId" : ObjectId("5560d515cae220180c37f9d5"),
"user" : ObjectId("5560daf3a09140800bb70a41"),
"created" : ISODate("2015-05-23T20:49:27.65Z"),
"__v" : 0
}

“POST”JSON 对象数组

/* 0 */
{
"_id" : ObjectId("5560d511cae220180c37f9d3"),
"title" : "titleteset",
"content" : "contentetest",
"user" : ObjectId("555d71825b6be608081553f1"),
"created" : ISODate("2015-05-23T19:29:21.732Z"),
"commentId" : [],
"likeId" : [ObjectId("5560d542cae220180c37f9dd"), ObjectId("5560d7799dbb4fe8114fa90c"), ObjectId("5560d8c1194d94f80aa4f230"), ObjectId("5560dba8a09140800bb70a47")],
"__v" : 19
}

/* 1 */
{
"_id" : ObjectId("5560d514cae220180c37f9d4"),
"title" : "titleteset",
"content" : "contentetest",
"user" : ObjectId("555d71825b6be608081553f1"),
"created" : ISODate("2015-05-23T19:29:24.027Z"),
"commentId" : [],
"likeId" : [ObjectId("5560d554cae220180c37f9de"), ObjectId("5560de899c93fb28161a7374"), ObjectId("5560e7c98d6e3fbc15999daa")],
"__v" : 4
}

/* 2 */
{
"_id" : ObjectId("5560d515cae220180c37f9d5"),
"title" : "titleteset",
"content" : "contentetest",
"user" : ObjectId("555d71825b6be608081553f1"),
"created" : ISODate("2015-05-23T19:29:25.761Z"),
"commentId" : [],
"likeId" : [ObjectId("5560db7ea09140800bb70a46"), ObjectId("5560e7d78d6e3fbc15999dab")],
"__v" : 4
}

添加:

我按照@Andrew Layers 的建议重构了我的代码,

我发现:

{ _id: 5560ef48a082c31c0a29062f,
postId: 5560d511cae220180c37f9d3,
user: 5560daf3a09140800bb70a41,
__v: 0,
created: Sun May 24 2015 06:21:12 GMT+0900 (Korea Standard Time) }
POST /api/posts/5560d511cae220180c37f9d3/likes 200 26.621 ms - 179
{ _id: 5560ef48a082c31c0a29062f,
postId: 5560d511cae220180c37f9d3,
user: 5560daf3a09140800bb70a41,
__v: 0,
created: Sun May 24 2015 06:21:12 GMT+0900 (Korea Standard Time) }
POST /api/posts/5560d511cae220180c37f9d3/likes 200 14.333 ms - 179
{ _id: 5560ef48a082c31c0a29062f,
postId: 5560d511cae220180c37f9d3,
user: 5560daf3a09140800bb70a41,
__v: 0,
created: Sun May 24 2015 06:21:12 GMT+0900 (Korea Standard Time) }
POST /api/posts/5560d511cae220180c37f9d3/likes 200 20.195 ms - 179

我得到了完全相同的结果变量,但 findOneAndRemove 删除了结果变量未指定的其他项目。

问题好像出在removing和pull off reference的逻辑上,目前还不知道是什么原因。

最佳答案

我在查询 findOneAndRemove 并仅输入 id 时发现了问题。 捂脸

使用 findByIdAndRemove 简单地解决了这个问题。

所以我现在的固定代码是:

exports.postLikes = function(req,res){
var like = new Like({
postId: req.params.postId,
user: req.user._id
});
Like.findOne({
user:req.user._id,
postId:req.params.postId
}).exec(function(err, result){
//if it exists, return "result"
if(result) {
console.log(result);
//remove the result by result.id
Like.findByIdAndRemove(result._id, function(err){
//pull off the reference from likeId array in Post
Post.findByIdAndUpdate(req.params.postId, {$pull:{'likeId':result._id}}, function(err){
if(err){res.send(err);}
res.json({status:'deleted', result:result});
});
});
}
else{
console.log(result);
like.save(function(err){
if(err){res.send(err);}
Post.findById(req.params.postId, function(err,post){
if(err) return res.send(err);
post.likeId.push(like);
post.save(function(err, foo){
if(err) return res.send(err);
res.json({status:'done', result:foo});
});
});
});
};
});
};

它工作得很漂亮,现在我可以 sleep 了,感谢大家对我的帮助,特别是 @Andrew Lavers,他提出了更好的代码。

关于javascript - findOneAndRemove 和 findOneAndUpdate 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30417389/

26 4 0
文章推荐: javascript - 使用 data-id 获取
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com