从Mongoose的数组中删除一个对象[重复]

Posted

技术标签:

【中文标题】从Mongoose的数组中删除一个对象[重复]【英文标题】:Remove an object from an array in Mongoose [duplicate] 【发布时间】: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吗? 【参考方案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 需要一个字符串

以上是关于从Mongoose的数组中删除一个对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose 从架构 arr 中删除对象 [重复]

Mongoose,从数组中删除一个对象并更新其他对象

从 Mongoose/MongoDB 中的数组中删除对象

节点/猫鼬 - 从数组中删除 ObjectId [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]

从 Mongoose Find() 查询向对象数组添加属性 [重复]