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块将执行。