Mongoose删除嵌套文档无效
我的问题是:我没有找到解决问题的办法。我的问题是:我有这样一个嵌套文档:Mongoose删除嵌套文档无效,mongoose,Mongoose,我的问题是:我没有找到解决问题的办法。我的问题是:我有这样一个嵌套文档: # js post.likes.pull({_id: '54ff6091933a118f790180e3'}); post.save(); # mongo db.posts.find() { "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ ] } Post对象是主对象,Post对象有两个嵌入对象,如Like和C
# js
post.likes.pull({_id: '54ff6091933a118f790180e3'});
post.save();
# mongo
db.posts.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ ] }
Post对象是主对象,Post对象有两个嵌入对象,如Like和Comment。这是javascript模式代码
var PostSchema = new Schema({
username: String,
post: String,
date: {
type: Date,
default: Date.now
},
likes:[Likes.Schema],
comments : [Comments.Schema]
});
var LikeSchema = new Schema({
username: String,
date: {
type: Date,
default: Date.now
}
});
var CommentSchema = new Schema({
username: String,
comment: String,
date: {
type: Date,
default: Date.now
}
});
我在mongodb上的测试数据如下:
{
"_id": {"$oid": "54fdbedf7c3da52a065ba71b"},
"post": "Deneme postuı",
"username": "fatihayyildiz",
"comments": [],
"likes": {
"username": "gurkan",
"_id": {"$oid": "54fdbf067c3da52a065ba71c"},
"date": {"$date": "2015-03-09T15:40:54.368Z"}
},
"date": {"$date": "2015-03-09T15:40:15.100Z"},
"__v": 0
}
所以,如果我回到我的问题,我想从我的post对象中删除类似的对象
{
"username": "gurkan",
"_id": {"$oid": "54fdbf067c3da52a065ba71c"},
"date": {"$date": "2015-03-09T15:40:54.368Z"}
}
所以我尝试了这个解决方案。如您所知,我正在使用mongoose库执行数据库操作:
var query = Like.find({ '_id': likeid });
//console.log(query);
query.remove(function(){
//console.log("Deleted");
res.json({
status:"Deleted"
});
}).exec();
这个代码推给我删除,没有错误,但当我检查我的数据库,它仍然存在
Mongoose版本为“^3.8.24”
如何从我的Post对象中删除此嵌套对象?这里有几点您需要了解。首先,如果您创建一个Like对象和一个Post对象,它将只存在于那里。例如:
# js
new Post({
username: 'test',
likes: [
{
username: test,
},
],
}).save(function(err, post) {
...
});
# mongo
db.posts.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ { "_id" : ObjectId("54ff6091933a118f790180e3"), "username" : "test" } ] }
db.likes.find()
要移除类似对象,您需要像这样从post中拉出对象:
# js
post.likes.pull({_id: '54ff6091933a118f790180e3'});
post.save();
# mongo
db.posts.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ ] }
如果希望类似对象成为其自己的对象,则需要首先创建对象并将其添加到帖子中:
# js
new Like({
username: 'test',
}).save(function(err, like) {
new Post({
username: 'test',
likes: [like],
}).save(function(err, post) {
...
});
})
# mongo
db.posts.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ { "_id" : ObjectId("54ff6091933a118f790180e3"), "username" : "test" } ] }
db.likes.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e3") }
但这并不意味着您可以简单地删除类似的对象,然后将其从post中删除。你还需要拉它
# js
like.remove();
# mongo
db.posts.find()
{ "username" : "test", "_id" : ObjectId("54ff6091933a118f790180e4"), "likes" : [ { "_id" : ObjectId("54ff6091933a118f790180e3"), "username" : "test" } ] }
db.likes.find()
希望这能解释一下。为了让它无缝地工作,你应该考虑在你的相似对象上移除钩子,这样每当一个对象被移除时,它就会从一个帖子上移除相似的东西
LikeSchema.post('remove', function(like) {
Post.find({likes: like._id}, function(err, posts) {
for (var post in posts) {
post.likes.pull({_id: like._id}).save();
}
})
})
或者类似的东西。你的数据看起来很奇怪,
likes
是模型上的一个数组,但JSON上的一个属性,这是打字错误还是错误的一部分?抱歉,我不明白你的问题@Felipepereira你的测试数据应该是“likes”:[array of likes]
但是“likes”:{like object}
我现在明白了。那么,我如何才能改变像这样的“喜欢”对象呢?谢谢你,你写了很多,但没有人在工作。我试过:post.likes.pull({u id:'54ff6091933a118f790180e3'});post.save()代码>和这个:LikeSchema.post('remove',function(like){post.find({likes:like.\u id}),function(err,posts){for(var post in posts){post.likes.pull({id:like.\u id}).save();}})
这是什么意思?你是说你运行了这段代码,但它仍然没有从mongodb中删除?是的,我运行了这两段代码,但仍然没有从mongodb中删除。当我尝试这段代码时,它对我很有用。您可以添加一些控制台日志以查看是否有任何情况发生。当我运行最后一个代码案例时,会出现以下错误:TypeError:Object function model(doc,fields,skipId){if(!(this instanceof model))return new model(doc,fields,skipId);model.call(this,doc,fields,skipId);}在router.post.post.post.post.postid(/home/ubuntu/workspace/api/services/PostService.js:64:14)中没有方法“post”