如何删除一个集合中的引用文档及其从另一个引用集合中的记录

时间:2020-02-06 22:44:30

标签: node.js mongodb mongoose

在我的NodeJS API和MongoDB中,我试图删除一条记录,该记录是对另一个集合的引用。 我想做的是删除所引用的objectId和与所引用的另一个集合相关的记录。

我有2个模型“个人档案”和“帖子”,我想从“个人档案”和“帖子”集合中删除同一一篇帖子。 我可以删除“个人资料”中的参考ID,但不知道如何从“帖子”集合中删除记录。

我尝试过:

async delete(req, res) {
        try {
            // Match with username and pull to remove
            await Profile.findOneAndUpdate(
                { _id: res.id._id },
                { $pull: { posts: req.params.postId } },
                err => {
                    if (err) {
                        throw new ErrorHandlers.ErrorHandler(500, err);
                    }
                    res.json({ Message: "Deleted" });
                }
            );
        } catch (error) {
            res.status(500).send(error);
        }
    } 

还有我的2个模型:

// Here defining profile model
// Embedded we have the Experience as []
const { Connect } = require("../db");
const { isEmail } = require("validator");

const postSchema = {
    type: Connect.Schema.Types.ObjectId,
    ref: "Post"
};

const experienceSchema = {
    role: {
        type: String,
        required: true
    },
    company: {
        type: String,
        required: true
    },
    startDate: {
        type: Date,
        required: true
    },
    endDate: {
        type: Date,
        required: false
    },
    description: {
        type: String,
        required: false
    },

    area: {
        type: String,
        required: true
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    username: {
        type: String,
        required: false
    },
    image: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    }
};

const profileSchema = {
    firstname: {
        type: String,
        required: true
    },

    surname: {
        type: String,
        required: true
    },

    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
        required: [true, "Email is required"],
        validate: {
            validator: string => isEmail(string),
            message: "Provided email is invalid"
        }
    },

    bio: {
        type: String,
        required: true
    },

    title: {
        type: String,
        required: true
    },

    area: {
        type: String,
        required: true
    },

    imageUrl: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    },

    username: {
        type: String,
        required: true,
        unique: true
    },

    experience: [experienceSchema],
    posts: [postSchema],

    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    }
};



const collectionName = "profile";
const profileSchemaModel = Connect.Schema(profileSchema);
const Profile = Connect.model(collectionName, profileSchemaModel);

module.exports = Profile;

const { Connect } = require("../db");

const reactionSchema = {
    likedBy: {
        type: String,
        unique: true,
        sparse: true
    }
};

const postSchema = {
    text: {
        type: String,
        required: true,
        unique: true,
        sparse: false
    },

    profile: {
        type: Connect.Schema.Types.ObjectId,
        ref: "Profile",
    },

    image: {
        type: String,
        default: "https://via.placeholder.com/150",
        required: false
    },
    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    reactions: [reactionSchema],

    comments: {
        type: Connect.Schema.Types.ObjectId,
        ref: "Comment",
        required: false
    }
};

const collectionName = "post";
const postSchemaModel = Connect.Schema(postSchema);
const Post = Connect.model(collectionName, postSchemaModel);

module.exports = Post;

1 个答案:

答案 0 :(得分:1)

只需添加一个查询以从个人资料集合中提取帖子的ID即可删除该帖子:

    MultivaluedSection(multivaluedOptions: [.Reorder, .Insert, .Delete],
                       header: "Multivalued TextField",
                       footer: ".Insert adds a 'Add Item' (Add New Fields) button row as last cell.") {
        $0.addButtonProvider = { section in
            return ButtonRow(){
                $0.title = "Add New Fields"

            }
        }
        $0.multivaluedRowToInsertAt = { index in
            return NameRow() {
                $0.placeholder = "Liters"


            }
        }
        $0.multivaluedRowToInsertAt = { index in
            return NameRow() {
                $0.placeholder = "Price"


            }
        }

        $0 <<< NameRow() {
            $0.placeholder = "Liters"
             print($0.value)
        }
        $0 <<< NameRow() {
            $0.placeholder = "Price"
             print($0.value)
        }

    }