我遇到了一个情况,我必须进行推拉结合。
我有一个分类和帖子的Schema,其中帖子可以有多个分类,而分类将有多个帖子的数组,使用Mongoose的对象引用方法,比如这样--。
PostSchema= new mongoose.Schema({
title:{type:String, required:true},
content:{type:String, required:true},
categories:[{type:mongoose.Schema.Types.ObjectId, ref:'Categories'}]
})
同样的方式,我也为类别设置了Schema-。
CatSchema = new mongoose.Schema({
name:{type:String, required:true},
slug:{type:String, required:true},
posts:[{type:mongoose.Schema.Types.ObjectId, ref:'Posts'}]
})
现在,当我创建一个帖子时,我把postId推送到Categories集合的所有类别中,但当我试图更新帖子并选择与之前不同的类别时,问题就会发生。
但当我尝试更新帖子并选择不同的类别时,问题就会发生。
我仍然可以在新选择的类别中推送更新的postId,但我如何从那些在更新时没有选择但在创建时选择的类别中提取postId。他们仍然存储这个postId,因为它是最初推送的。
更清楚的说,我希望每当更新一个分类时,都能更新分类集合中的post数组。欢迎所有类型的解决方案,包括创建模式或解决这个特殊问题的更好的方法。
我知道这次更新你需要postID,arrayOldCaretoryiesID,arrayNewCategoriesID。
让我们从当前帖子中找到并删除你需要的类别。
const deletedCatFromPost = await Post.updateOne({ _id: postID }, { $pull: { categories: arrayOldCaretoryiesID } })
其次,通过一个数组ID从旧分类中删除你需要的帖子。
const removedOldCategories = await Categories.updateMany({_id:{$or: arrayOldCaretoryiesID }},{ $pull:{ posts: postID }})
最后,通过一个ID数组向新类别中添加一个新的postID。
const addNewCategories = await Categories.updateMany({_id: { $or: arrayNewCategoriesID} },{$push:{ posts: postID }})
希望能帮到你。
更新内容:
第二,从旧的类别中按ID数组删除你需要的帖子。
const removedOldCategories = await Categories.updateMany({_id:{$in: arrayOldCaretoryiesID }},{ $pull:{ posts: postID }})