mongodb - 无法使用 Mongoose 删除数组中的对象
问题描述
此处已对此进行了广泛介绍,但是似乎没有一个解决方案对我有用。我正在尝试使用该对象的 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) },
},
}
);
数据库:
在这些变化中,我得到的通常响应是空数组或 null。
我能够稍微找到解决这个问题的方法,并通过利用 Schema 的主 _id 完成删除(而不是嵌套的:
.findOneAndUpdate(
{ _id: <main _id> },
{ $pull: { shifts: { _id: new Types.ObjectId(<nested _id>) } } },
{ new: true }
);
但我希望通过使用嵌套的_id 找出一种方法来做到这一点。有什么建议么?
解决方案
您当前遇到的问题是您使用的是相同的_id
.
使用 mongo,update方法允许三个对象:查询、更新和选项。
query
object 是将要更新的集合中的对象。update
是对对象执行的操作(添加、更改值...)。options
添加不同的选项。
然后,假设你有这个集合:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
},
{
"_id": 3
}
]
}
]
如果您尝试查找为_id
2 的文档,则显然响应将为空(示例)。
然后,如果没有找到任何文档,则不会更新任何文档。
如果我们使用 查找文档会发生什么shifts._id:2
?
这告诉 mongo“搜索shifts
字段具有_id
等于 2 的对象的文档”。此查询工作正常(示例),但要小心,这将返回整个文档,而不仅仅是匹配_id
.
这不返回:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
}
]
}
]
使用此查询 mongo 返回整个文档,其中存在一个名为的字段,该字段shifts
包含一个_id
值为 2 的对象。这也包括整个数组。
所以,有了 tat,你就知道find
对象为什么起作用了。现在将其添加到update
查询中,您可以创建查询:
这一项删除所有shifts._id
等于 2 的项。
db.collection.update({
"shifts._id": 2
},
{
$pull: {
shifts: {
_id: 2
}
}
})
shifts._id
或者如果 parent_id
等于 1 则删除这个
db.collection.update({
"_id": 1
},
{
$pull: {
shifts: {
_id: 2
}
}
})
推荐阅读
- php - PHP 工作得很好,但 SQL 没有更新
- java - DAO 类、SpringAMPQ 和 RabbitMQ 中的 EntityManager 为空
- c# - 如何生成保存到数组中的随机字符串?C#
- java - 我需要使用 JDBC 语句更新 mySQL 中的记录
- r - 使用 Pomp 包拉丁超立方抽样的不确定性敏感性分析
- ios - 使用 TabBar 导航时为 UIViewController 内容设置动画
- python - 使用带有反向引用的 df.name.str.replace
- delphi - 简单的代码是否可以在另一个应用程序中模拟鼠标点击?
- python - 如何将消息从 Pure Data 发送到 Python?
- vue.js - 如何在 vue 中使用验证