无法使用猫鼬删除数组中的对象
Can't remove object in array using Mongoose
此处对此进行了广泛介绍,但 none 的解决方案似乎对我有用。我正在尝试使用该对象的 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。
我能够稍微找到解决这个问题的方法,并通过利用模式的主要 _id(而不是嵌套的 _id)完成删除:
.findOneAndUpdate(
{ _id: <main _id> },
{ $pull: { shifts: { _id: new Types.ObjectId(<nested _id>) } } },
{ new: true }
);
但我希望通过使用嵌套的 _id 找到一种方法来做到这一点。有什么建议吗?
您目前遇到的问题是您正在使用相同的 _id
。
使用 mongo、update 方法允许三种 object:查询、更新和选项。
query
object 是 object 到 collection 将被更新。
update
是对 object 执行的操作(添加、更改值...)。
options
要添加的不同选项。
然后,假设你有这个 collection:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
},
{
"_id": 3
}
]
}
]
如果您尝试查找 _id
为 2 的文档,显然响应将是空的 (example)。
然后,如果找到 none 个文档,将更新 none 个文档。
如果我们使用 shifts._id:2
查找文档会怎样?
这告诉 mongo“搜索 shifts
字段的 object 且 _id
等于 2 的文档”。这个查询工作正常 (example) 但要小心,这个 return 是整个文档,而不仅仅是匹配 _id
.
的数组
这个不是return:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
}
]
}
]
使用此查询 mongo returns 整个文档存在一个名为 shifts
的字段,其中包含一个 object 和一个 _id
值为 2 .这也包括整个数组。
所以,通过 tat,您知道为什么 find
object 有效。现在将其添加到 update
查询中,您可以创建查询:
这个删除所有等于 2 的 shifts._id
。
db.collection.update({
"shifts._id": 2
},
{
$pull: {
shifts: {
_id: 2
}
}
})
或者如果 parent _id
等于 1
,则删除 shifts._id
db.collection.update({
"_id": 1
},
{
$pull: {
shifts: {
_id: 2
}
}
})
此处对此进行了广泛介绍,但 none 的解决方案似乎对我有用。我正在尝试使用该对象的 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。
我能够稍微找到解决这个问题的方法,并通过利用模式的主要 _id(而不是嵌套的 _id)完成删除:
.findOneAndUpdate(
{ _id: <main _id> },
{ $pull: { shifts: { _id: new Types.ObjectId(<nested _id>) } } },
{ new: true }
);
但我希望通过使用嵌套的 _id 找到一种方法来做到这一点。有什么建议吗?
您目前遇到的问题是您正在使用相同的 _id
。
使用 mongo、update 方法允许三种 object:查询、更新和选项。
query
object 是 object 到 collection 将被更新。update
是对 object 执行的操作(添加、更改值...)。options
要添加的不同选项。
然后,假设你有这个 collection:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
},
{
"_id": 3
}
]
}
]
如果您尝试查找 _id
为 2 的文档,显然响应将是空的 (example)。
然后,如果找到 none 个文档,将更新 none 个文档。
如果我们使用 shifts._id:2
查找文档会怎样?
这告诉 mongo“搜索 shifts
字段的 object 且 _id
等于 2 的文档”。这个查询工作正常 (example) 但要小心,这个 return 是整个文档,而不仅仅是匹配 _id
.
这个不是return:
[
{
"_id": 1,
"shifts": [
{
"_id": 2
}
]
}
]
使用此查询 mongo returns 整个文档存在一个名为 shifts
的字段,其中包含一个 object 和一个 _id
值为 2 .这也包括整个数组。
所以,通过 tat,您知道为什么 find
object 有效。现在将其添加到 update
查询中,您可以创建查询:
这个删除所有等于 2 的 shifts._id
。
db.collection.update({
"shifts._id": 2
},
{
$pull: {
shifts: {
_id: 2
}
}
})
或者如果 parent _id
等于 1
shifts._id
db.collection.update({
"_id": 1
},
{
$pull: {
shifts: {
_id: 2
}
}
})