Mongodb $pull 执行从嵌套子数组中删除 ObjectId("... id") 。
Posted
技术标签:
【中文标题】Mongodb $pull 执行从嵌套子数组中删除 ObjectId("... id") 。【英文标题】:Mongodb $pull performed to remove ObjectId("... id") from the nested sub array. 【发布时间】:2019-01-13 23:49:53 【问题描述】:我已经搜索了互联网的每个角落,试图解决这个问题,但到目前为止还无法解决。我正在尝试执行 mongodb $pull 函数以从嵌套在模式中的数组中删除对象。当我将 id 硬编码为 'ObjectId("5b68c9eec7171bc263660633")' 时,我成功地删除了 ObjectId。虽然当我将变量传递给它时它根本不起作用。
var ManagerSchema = Schema(
manager:
isIdentified:
type: Boolean,
default: false
,
employeeID: [** type: Schema.Types.ObjectId, ref: 'Employee' **]
);
var EmployeeSchema = Schema(
...
);
var Employee = mongoose.model('Employee', EmployeeSchema); // Employee
var Manager = mongoose.model('Manager', ManagerSchema); // Manager
在我从数据库中删除员工之前,我正在尝试删除上面的粗体部分:
Employee.pre('remove', function (next)
var employee = this;
Manager.update(,
$pull:
'manager.employeeID.$': 'ObjectId("5b68c9eec7171bc263660633")' // works
// though trying to make it dynamic
// 'manager.employeeID.$': ('\'ObjectId("' + employee._id + '")\'').toString() // doesnt work
// 'manager.employeeID.$': '\'ObjectId("' + employee._id + '")\'' // doesnt work
// 'manager.employeeID.$': mongoose.Types.ObjectId(`$employee._id`) // doesnt work
// 'manager.employeeID.$': new mongoose.Types.ObjectId(employee._id) // doesnt work
// 'manager.employeeID.$': mongoose.Types.ObjectId(employee._id) // doesnt work
// 'manager.employeeID.$': new ObjectID(employee._id) // doesnt work
// 'manager.employeeID.$': employee._id // doesnt work
// 'manager.employeeID.$': "_id": employee._id// doesnt work
,
multi: true
, () =>
next();
)
);
根据我在网上找到的所有文章,我尝试了很多其他的东西,虽然不知道为什么会删除纯文本,但变量不会。
非常感谢任何帮助。
【问题讨论】:
你能试试`ObjectId("$employee._id.toHexString()")`
吗?
这里不需要使用$
位置运算符...试试简单的$pull: 'manager.employeeID': '5b68c9eec7171bc263660633'
'manager.employeeID': mongoose.Types.ObjectId(employee._id)
?
天啊传奇!!! @Akrion 和 AnthonyWinzlet 的组合回答很有魅力!花了太长时间,做了太多的组合。感谢您的快速回复。感谢大家。这是行之有效的方法。 'manager.employeeID': mongoose.Types.ObjectId(employee._id) 请注意,该行中的 $ 不是类似于数组项吗?
【参考方案1】:
manager.employeeID
是正确的字段访问,因为您实际上并不需要 $
运算符,因为:
位置 $ 运算符限制来自 查询结果仅包含与查询匹配的第一个元素 文档。要指定要更新的数组元素,请参阅位置 $ 更新操作符。
在 find() 方法或 findOne() 的投影文档中使用 $ 当您只需要一个特定的数组元素时的方法 文件。
查看聚合运算符 $filter 以返回一个仅包含 那些符合指定条件的元素。
More on the $ here
正确的ObjectID
调用是mongoose.Types.ObjectId(employee._id)
,因为它是猫鼬类型定义的一部分,就像see here 一样。
【讨论】:
以上是关于Mongodb $pull 执行从嵌套子数组中删除 ObjectId("... id") 。的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它
MongoDB updateOne($pull) 匹配一个文档,但没有从数组中删除它
mongodb中$push和$pull的使用,向内嵌的数组中删除和添加元素
mongoose:使用$ pull删除嵌入式文档数组中的值(MongoDB 3.4版本)