帖子集
Post :
_id : 001,
comments : [1,2,3] // ObjectId
评论集
Comment:
{ _id : 1, message : "Bar" },
{ _id : 2, message : "Foo" },
{ _id : 3, message : "Bazz" }
我想删除一个帖子以及对此帖子的所有评论。但是如何删除其所有注释?
更新
{
model: String,
stock: Number,
images: [String],
price: Number,
views: { type: Number, default: 1 },
commentsCount: { type: Number, default: 0 },
comments: [{ type: Schema.Types.ObjectId, ref: "postComments" }],
postedBy: { type: String, ref: "publisherInfo" }
},
postComments模式
{
sender: String,
createAt: { type: Date, default: Date.now },
votes: { type: Number, default: 0 },
contain: String
},
答案 0 :(得分:2)
您可以使用findByIdAndDelete删除该文档并返回它。 现在,我们可以动态创建一个注释id数组,并将其与deleteMany和$ in运算符一起使用。所以我们只使用了两个数据库访问。
router.delete("/posts/:id", async (req, res) => {
try {
const result = await Post.findByIdAndDelete(req.params.id);
let commentIds = result.comments.map((c) => c._id);
await Comment.deleteMany({
_id: {
$in: commentIds,
},
});
res.send("OK");
} catch (err) {
console.log(err);
res.status(500).send("Something went wrong");
}
});
如果帖子已成功删除,但由于某种技术原因无法删除评论,则可以考虑使用transactions,以使操作成功或失败。
答案 1 :(得分:0)
这样,您可以安全地进行查询并删除所有注释。
如果您已经有ObjectId(id)
格式的ID,请删除ObjectId
const Posts = db.collection('posts')
const Comments = db.collection('collection')
const postToBeDeleted = await Posts.findOne({_id: ObjectId('posts')})
if(postToBeDeleted){
await Posts.deleteOne({_id: ObjectId('posts')}
for(const comment of postToBeDeleted.comments)
await Comments.deleteOne({_id: ObjectId(comment)})
}