首页 > 解决方案 > 删除帐户时如何从 MongoDB 中正确级联删除辅助对象?

问题描述

用户可以在我的应用程序上创建帐户,并可以点赞、分享 X 帖子。

问题是,每当用户删除他/她的帐户时,与他们相关的所有内容也应该被删除;到目前为止,我已经能够修复大部分问题,但是:

await this.model('Post').updateMany(
    {
      'sharedby.user': this._id
    },
    {
      $pull: { 'sharedby.user': this._id }
    }
  );

显然,我使用的是点表示法,因为user它是模型中 sharedby 对象中的对象之一Post。这里是:

sharedby: [
      {
        user: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'User'
        },
        post: {
          type: mongoose.Schema.Types.ObjectId,
          ref: 'Post'
        }
      }
    ],

只要有share,就会触发这个函数:

const newshare = await Post.findByIdAndUpdate(
    {
      _id: req.params.id,
      sharedby: { $ne: { user: req.user._id } }
    },
    {
      $push: { sharedby: { user: req.user._id, post: post._id } }
    },
    {
      new: true,
      runValidators: true,
      setDefaultsOnInsert: true
    }
  );

差不多就是这样。我真的不知道为什么它不起作用。有什么建议么?谢谢!。

标签: javascriptnode.jsmongodbexpressmongoose

解决方案


由于您想从中删除所有匹配的记录sharedby,我想您会想要使用$pullAll. 此外,当使用$pullor时$pullAll,您应该只使用点符号直到 Array 边界:

await this.model('Post').updateMany(
  {
    'sharedby.user': this._id
  },
  {
    $pullAll: { 'sharedby': { user: this._id } }
  }
);

另请参阅:从文档数组中删除项目


推荐阅读