无法使用 Mongoose 删除数组中的对象
Posted
技术标签:
【中文标题】无法使用 Mongoose 删除数组中的对象【英文标题】:Can't remove object in array using Mongoose 【发布时间】:2021-10-07 23:27:00 【问题描述】:此处已对此进行了广泛介绍,但似乎没有一个解决方案对我有用。我正在尝试使用该对象的 id 从数组中删除一个对象。目前,我的架构是:
const scheduleSchema = new Schema(
//unrelated
_id: ObjectId
shifts: [
_id: Types.ObjectId,
name: String,
shift_start: Date,
shift_end: Date,
,
],
);
我已经尝试了几乎所有类似的变体:
.findOneAndUpdate(
_id: req.params.id ,
$pull:
shifts: _id: new Types.ObjectId(req.params.id) ,
,
);
数据库:
Database Format
在这些变体中,我得到的通常响应是空数组或 null。
我稍微找到了解决这个问题的方法,并通过利用 Schema 的主 _id 完成删除(而不是嵌套的:
.findOneAndUpdate(
_id: <main _id> ,
$pull: shifts: _id: new Types.ObjectId(<nested _id>) ,
new: true
);
但我希望通过使用嵌套的 _id 找到一种方法。有什么建议吗?
【问题讨论】:
您使用相同的值 (req.params.id
) 搜索 _id
和 shifts._id
。这是正确的还是它们是不同的_id
's?也许您正在寻找: 'shifts._id': req.params.id
在您的查询中,
刚刚更新。往上看。我以前使用相同的值,但能够通过使用条目的最高嵌套 _id 来完成删除。不过,我仍然想知道是否有更好的方法来实现这一点。
啊,是的。我明白你的意思了。这似乎奏效了。谢谢! .findOneAndUpdate( 'shifts._id': new Types.ObjectId(req.params.id) , $pull: shifts: _id: new Types.ObjectId(req.params.id) , , , 新:真 );
如果你愿意,我可以添加一个答案以更好地解释我的评论。
是的,拜托!那太好了。
【参考方案1】:
您目前遇到的问题是您使用的是相同的_id
。
使用 mongo,update 方法允许三个对象:查询、更新和选项。
query
object 是将要更新的集合中的对象。
update
是对对象执行的操作(添加、更改值...)。
options
添加不同的选项。
那么,假设你有这个收藏:
[
"_id": 1,
"shifts": [
"_id": 2
,
"_id": 3
]
]
如果您尝试查找_id
为2 的文档,显然响应将为空(example)。
然后,如果没有找到任何文档,则不会更新任何文档。
如果我们使用 shifts._id:2
查找文档会发生什么?
这告诉 mongo“搜索一个文档,其中 shifts
字段有一个 _id
等于 2 的对象”。此查询可以正常工作(example),但要小心,这会返回整个文档,而不仅仅是匹配 _id
的数组。
这个不返回:
[
"_id": 1,
"shifts": [
"_id": 2
]
]
使用此查询 mongo 会返回整个文档,其中存在一个名为 shifts
的字段,其中包含一个带有值为 2 的 _id
的对象。这也包括整个数组。
所以,有了 tat,您就知道为什么 find
对象有效。现在将其添加到 update
查询中,您可以创建查询:
这个删除所有等于2的shifts._id
。
db.collection.update(
"shifts._id": 2
,
$pull:
shifts:
_id: 2
)
Example
如果父 _id
等于 1,则删除此 shifts._id
db.collection.update(
"_id": 1
,
$pull:
shifts:
_id: 2
)
Example
【讨论】:
以上是关于无法使用 Mongoose 删除数组中的对象的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 mongoose 使用 API 删除数组中的某些内容?
无法从 Mongoose 访问 populate()'d 对象的属性?
将对象数组添加到突变 react-graphql-apollo-mongoose 时,“无法读取未定义的属性 'get'”