从猫鼬的数组中删除对象

时间:2019-06-07 14:00:26

标签: javascript node.js mongodb 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的数组中删除对象?

1 个答案:

答案 0 :(得分:0)

您应该可以使用array.pull(请参阅https://mongoosejs.com/docs/api.html#mongoosearray_MongooseArray-pull

下面是我修改您的代码并使用async / await而不是回调的示例。

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);
    }
  });
});