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版本)

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

匹配 MongoDB 中嵌套子文档的嵌套数组