Javascript 从Mongoose中的数组中删除对象
我正在尝试使用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 } } 这就是我当前从阵列中删除该文件所做的操作。附件
{
_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吗?您也尝试过转换类型objectIDmongoose.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需要一个字符串