findOneAndRemove和findOneAndUpdate不能按预期工作

我正在尝试使Facebook中的“like”切换。

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

当只有一个“喜欢”的时候也删除查找。

但是有许多喜欢的话开始成为问题。

因为我喜欢不同的职位,

在这里输入图像说明

它增加了正确的参考

在这里输入图像说明

我又加了一个

在这里输入图像说明

现在这是问题 – 我实际上按下了第三个button,但结果是不同的。 最上面的一个被删除了。

我的模型由Mongoose Schema构成如下:

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} }); 

没有中间件。

这是我的应用程序的控制器部分:

 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对象arrays

(喜欢的数据已经被删除了,所以我又做了)

 /* 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对象arrays

 /* 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所build议的代码,

我发现:

 { _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 

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

这个问题似乎是从逻辑上去除和牵制的,还不知道原因。

我发现问题在查询findOneAndRemove并把只有idfind它。 捂脸

使用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}); }); }); }); }; }); }; 

它的作品非常漂亮,现在我可以入睡了,谢谢大家的帮助,尤其是对于推荐更好的代码的@Andrew Lavers。

我的第一个猜测是你的Like.find查询返回多个文档,而findOneAndRemove代码只是删除列表中的第一个,而不是你想要的那个。

你可以通过loggingresult.length来testing,看看是否是这种情况。

在任何情况下,没有理由创build一个Like对象来运行您的查询。 and()也是没有必要的。 相反,你可以像这样使用findOne

 Like.findOne({ user:req.user._id, postId:req.params.postId }).exec(function(err, result){ //if it exists, return "result" if(result) { //remove the result by result.id Like.findOneAndRemove(result._id, function(err){ //pull off the reference from likeId array in Post Post.findOneAndUpdate({'_id':req.params.postId}, {$pull:{'likeId':result._id}}, function(err){ if(err){res.send(err);} res.json({status:'deleted'}); }); }); } else { //... } }); 

如果文档不存在, result将为null ,您的else块将执行。