Javascript 从Mongoose中的数组中删除对象

Javascript 从Mongoose中的数组中删除对象,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在尝试使用mongoose从文档中的数组中删除对象 这是一个条目示例: { _id: "12345", folder: { name: "Folder1", files: [ { fileName: "File 1", fileID: "6789", folderID: "12345" } ], active: true } } 这就是我当前从阵列中删除该文件所做的操作。附件

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

这是一个条目示例:

{
  _id: "12345",
  folder: {
    name: "Folder1",
    files: [
      {
        fileName: "File 1",
        fileID: "6789",
        folderID: "12345"
      }
    ],
    active: true
  }
}
这就是我当前从阵列中删除该文件所做的操作。
附件.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
而不是
findbyidanddupdate
如何从
文件ID为
6789
的数组中删除对象?

您应该能够使用
数组。拉动
(请参阅)

下面是一个示例,其中我修改了您的代码,并使用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);
    }
  });
});

您应该能够使用
array.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);
    }
  });
});


也尝试过转换类型objectID
mongoose.Types.objectID(req.params.id)
您的子文档是否有
\u id
s?如果是这样,您可以执行
folder.files.id(fileId).remove()
。查看他们没有
\u id
s这都是一个模式您尝试过
$pull:{“folder.files”:{fileID:req.params.id}
而不是$elemMatch吗?您也尝试过转换类型objectID
mongoose.Types.objectID(req.params.id)
您的子文档有
\u id
s吗?如果是这样,您可以执行
folder.files.id(fileId).remove()
。查看他们没有
\u id
s这都是一个模式如果您尝试了
$pull:{“folder.files”:{fileID:req.params.id}
而不是$elemMatch?这会得到整个阵列的值您确定吗?拉动应将其从物体上移除。显然,您必须按照我的示例完成保存,否则更改将不会保存到数据库中。我刚刚意识到您的文件夹模型有一个“文件夹”字段,因此它是
Folder.Folder.files.pull
而不是
Folder.files.pull
。是的,我认识到了这一点,并尝试了正确的方法。我相信拉动可能不起作用,因为它不是另一个模式或对象,就像docs stateI dunno一样,我觉得还有其他问题,因为array.pull或findByIdAndUpdate都不适用于您。如果在我的代码示例中使用例如
const file=folder.folder.files.find(file=>file.fileID===req.params.id)
,您能在数组中找到对象吗?您确定字段名是fileID吗?你确定值没有错吗(例如,req.params.id是一个数字,但fileID需要一个StringThis获取整个数组的值你确定吗?Pull应该从对象中删除它。显然,你必须按照我的示例完成保存,否则更改不会保存到数据库。我刚刚意识到你的文件夹模型有一个“文件夹"字段,因此它是
文件夹.folder.files.pull
而不是
文件夹.files.pull
。是的,我认识到了这一点,并以正确的方式尝试了它。我相信这个pull可能不起作用,因为它不是另一个模式或像docs state那样的对象。我不知道,我有一种感觉,因为array.pull或findbyidandUpdate都没有出现问题e为您工作。如果在我的代码示例中使用例如
const file=folder.folder.files.find(file=>file.fileID===req.params.id)
,您能在数组中找到对象吗?您确定字段名是fileID吗?您确定值没有错误(即req.params.id是一个数字,但fileID需要一个字符串