Mongoose 从数组中的数组中拉出对象

Posted

技术标签:

【中文标题】Mongoose 从数组中的数组中拉出对象【英文标题】:Mongoose pull object from array inside array 【发布时间】:2017-08-08 03:43:50 【问题描述】:

我目前正在使用 Node.js 和 Mongoose 来操作 MongoDB 数据库。我想从数组本身的数组中删除一个对象。

var newTable = new module.Table(
  "_id": ObjectId("1"),
  "name": "Table1",
  "items": [
    
      "_id": ObjectId("11"),
      "name": "Item1",
      "subscribers": [
        
          "itemId": "111"
        ,
        
          "itemId": "112"
        
      ]
    
  ]
).save();

我试过这个查询,但没有效果:

module.Table.update(
   "items._id": "11" ,
   $pull:  "items.$.subscribers":  "itemId": "112"   ,
   "safe": true ,
  function (err, obj) 
    if (err) console.log(filename + " @ module.Table.update(): " + err);
  
);

请帮我查询一下。

注意 1:ObjectId("xxx") 是本示例的简化引用。

注意2:我发现了这个错误,这是我的错误,查询需要id作为字符串(而不是ObjectId)。

【问题讨论】:

我看到的第一件事是你有 "itemId": ObjectId("112") 。你意识到javascript没有objectId。您可能需要执行以下操作:new mongoose.mongo.ObjectId('56cb91bdc3464f14678934ca') 将某些内容转换为对象 ID 以检查数据库中的对象 ID。看起来您的 objectIds 无效。所以我不知道您如何使用这些 objectID。你遇到了什么错误? 你说得对,我忘了说明 ObjectId("xxx") 是这个例子的简化引用。 【参考方案1】:

虽然 jack Blank 在 cmets 中部分正确,但我想进一步澄清这个答案,因为我遇到了麻烦。 就我而言,解决方案如下:

    在您的脚本中导入猫鼬(注意它的导入方式)。
const mongoose = require('mongoose');
    然后确保您在更新许多文档的情况下使用 updateMany()
await Order.updateMany(,
  $pull: 
    'products': mongoose.Types.ObjectId(req.params.id)
  ,
).exec();

注意 ObjectId 不是 new mongoose.mongo.ObjectId() 而是mongoose.Types.ObjectId()

【讨论】:

以上是关于Mongoose 从数组中的数组中拉出对象的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法通过在 Mongoose 中查询来更新文档数组中的对象?

从 Mongoose/MongoDB 中的数组中删除对象

如何在 PHP/Eclipse 中对 foreach 循环中从数组中拉出的自定义对象进行智能感知?

从Mongoose的数组中删除一个对象[重复]

无法使用 Mongoose 删除数组中的对象

从 mongodb 数组中的所有重复项中拉出一个元素