首页 > 解决方案 > 用猫鼬删除嵌套对象

问题描述

我得到了这个猫鼬模式:

const UserSchema = new Schema({
  email: {
    type: String,
    required: true,
    unique: true,
  },
  groups: [
    {
      groupName: {
        type: String,
        required: true,
      },
      groupMembers: [{ type: Schema.Types.ObjectId, ref: "GroupMember" }],
    },
  ],
});


const GroupMemberSchema = new Schema({
    firstName: String,
    lastName: String,
    birthday: Date,
    gender: String,
    age: Number
});

我想要2条路线:

我对删除组成员路由的尝试。此路由成功从集合中删除组成员groupMembers,但组成员仍然存在于user集合中:

router.delete(
  "/:userId/:groupId/:groupMemberId",
  catchAsync(async (req, res) => {
    const { userId, groupId, groupMemberId } = req.params;
    await GroupMember.findByIdAndDelete(groupMemberId);
    const user = await User.findById(userId);
    const group = user.groups.find((group) => group._id.toString() === groupId);
    const groupIndex = user.groups.indexOf(group);
    const updatedGroupmembers = user.groups[groupIndex].groupMembers.filter(groupMember=> groupMember._id.toString()!==groupMemberId);
    res.send({updatedGroupmembers})
  })
);

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


您是否尝试过使用 $pull?

router.delete(
  '/:userId/:groupId/:groupMemberId',
  catchAsync(async (req, res) => {
    const { userId, groupId, groupMemberId } = req.params;
    await GroupMember.findByIdAndDelete(groupMemberId);
    const updatedUser = await User.findByIdAndUpdate({ id: userId }, { $pull: { groups: groupId } }, { new: true });
    res.send({ updatedUser });
  }),
);


推荐阅读