从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
。 如何从数组中删除fileID
为6789
的对象?
【问题讨论】:
也尝试过强制转换类型objectIDmongoose.Types.ObjectId(req.params.id)
您的子文档有_id
s 吗?如果是这样,您可以这样做folder.files.id(fileId).remove()
。见mongoosejs.com/docs/subdocs.html#removing-subdocs
他们没有_id
s 都是一个模式
你试过$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的数组中删除一个对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章