当前位置: 首页 > 知识库问答 >
问题:

Node/Mongoose-从Array[重复]中删除ObjectId

祁雪峰
2023-03-14

我正在建设的网站上有一个带有评论功能的页面。该网站类似于Yelp for campsites,mongo db集合中的每个露营地都有一个字段-comments-用于存储该露营地上发布的每条评论的id,该id引用另一个名为comments的集合中的对象。添加、编辑、查看和删除评论除了删除评论外,该评论的id不会从其关联营地的评论数组中删除。

以下是一个目前营地记录的例子:

{ 
     "_id" : ObjectId("5b18331953b9811c54ddc4cd"),
          "contact" : { 
          "phone" : "403-748-4066", 
          "email" : "", 
          "website" : "https://www.albertaparks.ca/parks/central/aspen-beach-pp/information-facilities/camping/lakeview/" 
     }, 
     "author" : { 
          "id" : ObjectId("5a998953342cbc7fe8521ef5"), 
          "username" : "Adam" 
     }, 
     "createdAt" : ISODate("2018-06-06T19:04:25.418Z"), 
     "comments" : [ 
          ObjectId("5b1bf59f8f21e152cce41b49") 
     ], 
     "name" : "Lakeview", 
     "cost" : "40", 
     "location" : "Range Rd 284, Bentley, AB T0C 0J0, Canada", 
     "image" : "https://c1.staticflickr.com/9/8620/16612167676_6418f1b470_b.jpg",
      "description" : "Open, pull-through sites are well-suited to RVs. There are unserviced, power, and power/water options. Trees provide some shade from the summer sun. There are many amenities available including a boat launch, playground, sewage disposal, flush toilets and showers. Camp along Gull Lake and enjoy swimming, boating, and the beach. Explore the trails and boardwalks for walking, biking, bird and wildlife watching. ", 
     "lat" : 52.4357744, 
     "__v" : 1, 
     "long" : -113.9873582 
}

如您所见,营地对象当前引用了一条注释,但如果我通过UI删除该注释,它将停止显示该注释,因为它将从注释集合中删除,但营地对象中对注释的引用将保留。以下是我当前删除评论的代码:

app.delete("/campgrounds/:id/comments/:comment_id", middleware.checkCommentOwnership, function(req, res){
    // RESTful - DESTROY
    Comment.findByIdAndRemove(req.params.comment_id, function(err){
        if(err){
            req.flash("error", "Uh Oh! Something went wrong.");
            res.redirect("/campgrounds");
        }
        Campground.findById(req.params.id, function(err, campground){
            if(err){
                req.flash("error", "Uh Oh! Something went wrong.");
                res.redirect("/campgrounds");
            }
            campground.comments.remove(req.params.comment_id);
            req.flash("success", "Comment has been deleted!");
            res.redirect("back");
        });
    });
});

然而这条线

campground.comments.remove(req.params.comment_id); 

似乎不起作用。我也(粗略地)尝试过

campground.comments.remove("ObjectId(\"" + req.params.comment_id + "\")")

要尝试镜像ID存储的格式,请在注释数组中,但这会引发以下错误:

CastError: Cast to ObjectId failed for value "ObjectId("5b1bf4215f319752ab28ba49")" at path "comments"

我使用Mongoose主要是为了与db接口。

抱歉,如果这是冗长的或重复的,我试图研究解决方案,但什么也找不到——至少没有我能理解的!

谢谢。

共有2个答案

邢财
2023-03-14

尝试从数组中删除,标记为已更改并保存,如下所示

app.delete("/campgrounds/:id/comments/:comment_id", middleware.checkCommentOwnership, function(req, res){
// RESTful - DESTROY
Comment.findByIdAndRemove(req.params.comment_id, function(err){
    if(err){
        req.flash("error", "Uh Oh! Something went wrong.");
        res.redirect("/campgrounds");
    }
    Campground.findById(req.params.id, function(err, campground){
        if(err){
            req.flash("error", "Uh Oh! Something went wrong.");
            res.redirect("/campgrounds");
        }
            campground.comments.filter(comment => comment.toString() === 
                req.params.comment_id);
            campground.markModified('comments');
            campground.save(function(err){
            if(err){
                 req.flash("error", "Uh Oh! Something went wrong.");
                 res.redirect("/campgrounds");
                 return;
            }
            req.flash("success", "Comment has been deleted!");
            res.redirect("back");
                })
        });
    });
});
公风史
2023-03-14

你需要使用mongodb$拉运算符删除comment_id从数组...

Campground.update({ _id: req.params.id }, { $pull: { comments: req.params.comment_id } }, function(err, campground){
    if(err){
        req.flash("error", "Uh Oh! Something went wrong.");
        return res.redirect("/campgrounds");
    }
    req.flash("success", "Comment has been deleted!");
    return res.redirect("back");
});
 类似资料:
  • 问题内容: 我有一个自定义对象的ArrayList。我要删除重复的条目。 对象具有三个字段:和。如果字幕多次出现,那么我只需要带有thats字幕的第一项(忽略带有该字幕的其余对象)。 问题答案: 您可以使用自定义Comparator将ArrayList的内容放入TreeSet中,如果两个字幕相同,则应返回0。之后,您可以将Set转换为列表,并使列表中没有“重复项”。这是对象的示例,您当然应该使用正

  • 问题内容: 数据库类型为PostGres 8.3。 如果我写了: 我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。) 例子: 应该变成: 我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。 警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。 问题答案: 这是所有表都应具有主键的众多原因之

  • 问题内容: 我有一个字符串数组列表,并在其中添加了一些重复值。我只想删除那个重复的值,那么如何删除它。 在这个例子中我有一个主意。 但是有没有足够的方法来删除该重复表格列表。没有使用For循环?我可以通过使用HashSet或其他方式来做到这一点,但只能使用数组列表。想对此提出您的建议。谢谢您的提前答复。 问题答案: 您可以从列表中创建一个。在将包含每个元素只有一次,在相同的顺序。然后从创建一个新的

  • 问题内容: 我的数据库中有一个表,其中有要删除的重复记录。我不想为此创建具有不同条目的新表。我想要的是从现有表中删除重复的条目,而无需创建任何新表。有什么办法吗? 看到这些都是我的字段: id对于每一行都是唯一的。 L11_data对于相应的动作字段是唯一的。 L11_data具有公司名称,而动作具有行业名称。 因此,在我的数据中,我在L11_data中有各自行业的重复公司名称。 我要拥有的是存储

  • 问题内容: 我使用下面的代码行遍历数据库中的一个表: 如果我打印出数组: 我会得到这个: 但是我想摆脱数组中的重复项,所以我使用 我得到下面的奇怪结果,这不是我想要的结果: 理想情况下,我认为它应该返回以下内容: 我该怎么做才能正确处理?我使用了错误的PHP语法/默认功能吗? 问题答案: 该功能将为您完成此操作。您只需要添加标志:

  • 我有2个数据帧,和,有一个列(和其他非重要的)。 我想在中删除包含已在中的电子邮件的行。 我该怎么做?