Mongoose mongodb,删除数组中的元素

时间:2016-09-10 09:13:38

标签: mongoose

- NodeJS,Mongoose,MongoDB,ExpressJS,EJS -

我的网站是,有一个登录用户,他们可以提交" name"和"图像"他们想要什么,然后作者和其他人可以对这张照片发表评论。在每个图像上,我添加了一个函数,我使用.length函数计算注释,该函数计算图片上的注释并将注释的数量投影到我的ejs文件。

这是我的架构:

var testSchema = new mongoose.Schema({
    name: String,
    image: String,
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Loginuser"
        },
            username: String
    },
    comments: [
        {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Comment"
        }
    ]
});

var commentSchema = new mongoose.Schema ({
    author: {
        id: {
            type: mongoose.Schema.Types.ObjectId,
            ref: "Loginuser"
        },
        username: String
    },
    text: String,
    date: String
});

var loginSchema = new mongoose.Schema ({
    username: String,
    password: String
});


var TestData = mongoose.model("User", testSchema);
var Comment = mongoose.model("Comment", commentSchema);
var LoginUser = mongoose.model("Loginuser", loginSchema);

我有一个删除用户评论的功能,

app.delete("/index/:id/comments/:comment_id", function(req, res){
    Comment.findByIdAndRemove(req.params.comment_id, function(err){
        if(err) {
            console.log(err);
            res.redirect("/index/");
        } else {
            console.log("Comment successfully deleted!");
            res.redirect("back");
        }
    });
});

这是我的mongoDB中的一些示例数据 的 commentSchema

{ "_id" : ObjectId("57d316e506d8e9186c168a49"), 
  "text" : "hey baby! why cry?", "
__v" : 0, 
  "author" : { "id" : ObjectId("57d148acd0f11325b0dcd3e6"), 
  "username" :
  "nagy" }, 
  "date" : "9/10/2016 , 8:07 AM" }

{ "_id" : ObjectId("57d316f706d8e9186c168a4a"), 
  "text" : "don't you cry baby!",
"__v" : 0, 
  "author" : { "id" : ObjectId("57d095d727e6b619383a39d0"), 
  "username": "doge" }, 
  "date" : "9/10/2016 , 8:07 AM" }

{ "_id" : ObjectId("57d3170306d8e9186c168a4b"), 
  "text" : "wow so cute!!!!!!", "_
_v" : 0, 
 "author" : { "id" : ObjectId("57d095d727e6b619383a39d0"), 
 "username" : "doge" }, "date" : "9/10/2016 , 8:07 AM" }

以及 testSchema

的数据
{ "_id" : ObjectId("57d316c506d8e9186c168a47"), 
      "name" : "Baby crying", 
      "image": "https://s-media-cache-ak0.pinimg.com/564x/d0/bb/ed/d0bbed614353534df9a3be0abe
    5f1d78.jpg", 
       "comments" : [ ObjectId("57d316e506d8e9186c168a49"), ObjectId("57d3
    16f706d8e9186c168a4a") ], "author" : { "id" : ObjectId("57d095d727e6b619383a39d0
    "), "username" : "doge" }, "__v" : 2 }

{ "_id" : ObjectId("57d316dc06d8e9186c168a48"), 
  "name" : "Maria?! OZawa?!", 
  "image" : "https://dncache-mauganscorp.netdna-ssl.com/thumbseg/1092/1092126-bigthumb
nail.jpg", 
  "comments" : [ ObjectId("57d3170306d8e9186c168a4b") ], "author" : { "
id" : ObjectId("57d148acd0f11325b0dcd3e6"), "username" : "nagy" }, "__v" : 1 }

如您所见,testSchema和commentSchema上的注释的objectId是相同的。基本上他们是相关的。

它工作正常,它正在删除评论。这里的问题是,它只删除"评论"模型。

我想在" TestData"上删除相同的评论。模型,因为每次删除评论时,评论的数量都保持不变。

我想删除两个模型上的特定评论。

我尝试使用这种方法:

app.delete("/index/:id/comments/:comment_id", function(req, res){
        TestData.findByIdAndRemove(req.params.comment_id)function(err){
        if(err) {
            console.log(err);
            res.redirect("/index");
        } else {
            res.redirect("back");
        }
    });
});

但它不起作用。

你能帮我解决一下我应该使用的具体查询吗?

更新:我添加了一个预先中间件,但仍然没有工作,也许我做错了。我已将预备中间件置于" app.delete"之上。那是对的吗?

commentSchema.pre('remove', function (next) {
  User.update(
    { comments: this }, 
    { $pull: { comments: this._id } }, 
    { multi: true }
  ).exec(next)
});

app.delete('/index/:id/comments/:comment_id', function (req, res) {
  Comment.findById(req.params.comment_id, function(comment){
        comment.remove();
        console.log("comment succesfully deleted!");
        res.redirect("back");
    });
  });

在阅读了与我有类似问题的stackoverflow之后,我也尝试了这个...类似的预备中间件,但它使用"更新"。

    commentSchema.pre('update', function (next) {
  this.model('User').update(
    { comments: this }, 
    { $pull: { comments: this._id } }, 
    { multi: true }
  ).exec(next)
});

app.delete('/index/:id/comments/:comment_id', function (req, res) {
  Comment.findById(req.params.comment_id, function(comment){
        comment.update();
        console.log("comment succesfully deleted!");
        res.redirect("back");
    });
  });
是的,还是没有工作:(

1 个答案:

答案 0 :(得分:1)

您需要手动删除数组中的注释ID。更好的方法是在评论模式中添加remove middleware

commentSchema.pre('remove', function (next) {
  User.update(
    { comments: this }, 
    { $pull: { comments: this._id } }, 
    { multi: true }
  ).exec(next)
})

但删除中间件只能通过调用doc.remove而不是Model.findByIdAndRemove来执行。因此,您需要更改一些代码(我在这里使用promises以获得更好的可读性,但您可以使用回调来执行此操作):

app.delete('/index/:id/comments/:comment_id', function (req, res) {
  Comment.findById(req.params.comment_id)
    .then(function (comment) {
      return comment.remove() // doc.remove will trigger the remove middleware
    })
    .then(function () {
      console.log('Comment successfully deleted!')
      return res.redirect('back')
    })
    .catch(function (err) {
      console.log(err)
      res.redirect('/index')
    })
})