Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongoose删除嵌套文档无效_Mongoose - Fatal编程技术网

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”