【问题标题】:Remove an object from an array in Mongoose [duplicate]从Mongoose的数组中删除一个对象[重复]
【发布时间】:2019-10-23 01:08:52
【问题描述】:

我正在尝试使用 mongoose 从文档中的数组中删除一个对象。

这是一个条目的示例:

{
  _id: "12345",
  folder: {
    name: "Folder1",
    files: [
      {
        fileName: "File 1",
        fileID: "6789",
        folderID: "12345"
      }
    ],
    active: true
  }
}

这就是我目前正在做的从数组中删除文件的操作。 Attachment.unlink 是从 gridfs 文件存储中删除文件的原因。这部分代码有效。但是,我的对象不会从数组中删除。

router.delete("/filesystem/:id", (req, res, next) => {
  Attachment.unlink(req.params.id, (error, attachment) => {
    if (!attachment) return res.status(404);
    if (error) return next(error);
    Folder.findByIdAndUpdate(
      {
        _id: req.body.folderID
      },
      {
        $pull: {
          "folder.files": {
            $elemMatch: { fileID: req.params.id }
          }
        }
      },
      { multi: true, safe: true },
      (error, folder) => {
        if (error) return next(error);
        return res.status(200).json({
          folder
        });
      }
    );
  });
});

我也尝试使用update 而不是findByIdAndUpdate如何从数组中删除fileID6789 的对象?

【问题讨论】:

  • 也尝试过强制转换类型objectID mongoose.Types.ObjectId(req.params.id)
  • 您的子文档有_ids 吗?如果是这样,您可以这样做folder.files.id(fileId).remove()。见mongoosejs.com/docs/subdocs.html#removing-subdocs
  • 他们没有_ids 都是一个模式
  • 你试过$pull: { "folder.files": { fileID: req.params.id } }而不是$elemMatch吗?

标签: javascript node.js mongodb mongoose


【解决方案1】:

你应该可以使用array.pull(见https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-pull

以下是我修改了您的代码并使用异步/等待而不是回调的示例。

router.delete("/filesystem/:id", (req, res, next) => {
  Attachment.unlink(req.params.id, async (error, attachment) => {
    if (!attachment) return res.status(404);
    if (error) return next(error);

    try {
      const folder = await Folder.findById(req.body.folderID);
      folder.folder.files.pull({ fileID: req.params.id });
      await folder.save();

      return res.status(200).json({
        folder
      });
    } catch (error) {
      return next(error);
    }
  });
});

【讨论】:

  • 这个得到整个数组的值
  • 你确定吗?拉应将其从对象中移除。显然你必须按照我的例子完成保存,否则更改将不会保存到数据库中。
  • 我刚刚意识到您的文件夹模型有一个“文件夹”字段,所以它是 folder.folder.files.pull 而不是 folder.files.pull
  • 是的,我认识到这一点并以正确的方式尝试了它。我相信 pull 可能不起作用,因为它不是另一个 Schema 或像文档状态这样的 ObjectID
  • 我不知道,我觉得还有其他问题,因为 array.pull 或 findByIdAndUpdate 都不适合你。如果您在我的代码示例中使用例如const file = folder.folder.files.find(file => file.fileID === req.params.id),您能在数组中找到对象吗?您确定字段名称是 fileID 吗?你确定这个值没有错吗(即 req.params.id 是一个数字但 fileID 需要一个字符串
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-26
  • 2018-11-14
  • 2018-04-26
  • 2019-11-23
  • 1970-01-01
  • 2016-03-16
  • 2021-07-27
相关资源
最近更新 更多