Mongoose -通过对象数组中的_ID删除子文档

0ejtzxu1  于 5个月前  发布在  Go
关注(0)|答案(2)|浏览(67)
party

{
  _id: new ObjectId('6570d8aef19ec1c690cc8d34'),
  name: 'party',
  items: [
    {
      name: 'Welcome to your todo list',
      _id: new ObjectId('6570d8aaf19ec1c690cc8d31')
    },
    {
      name: 'Hit the + button to add a new item.',
      _id: new ObjectId('6570d8aaf19ec1c690cc8d32')
    },
    {
      name: 'Hit this to delete an item.',
      _id: new ObjectId('6570d8aaf19ec1c690cc8d33')
    },
    { name: 'heya', _id: new ObjectId('6570ee634c6ed501ba04974a') },
    { name: 'hoiya', _id: new ObjectId('6570eea34c6ed501ba049778') },
    { name: 'heyty', _id: new ObjectId('6570ef6d934fb47039850682') },
    { name: 'dsfdsf', _id: new ObjectId('6570efcad07077740a80ce5a') },
    { name: 'hey', _id: new ObjectId('6570f193c6b50f3c3d692951') },
    { name: 'hiii', _id: new ObjectId('6570f1bcc6b50f3c3d69299b') }
  ],
}

字符串
我试图访问内部数组(items)的_id以在该ID上应用删除。我想通过_id删除该项目,但不幸的是,我无法在Mongoose文档网站上的文档/示例中找到答案。我目前正在使用Mongoose
“mongoose”:“^8.0.2”
所以我更倾向于在NodeJS上使用nodec/await方法。

// Equivalent to `parent.children.pull(_id)`
parent.children.id(_id).deleteOne();


显然,使用这两种方法对我来说都不起作用,它返回undefined(我可能做得不对)。
我希望使用_id的项目删除一个项目的ID。请建议Mongoose方法只。

bvpmtnay

bvpmtnay1#

您需要$pull运算符从items数组中删除匹配的对象。

await <Party model>.updateOne({
  "items._id": _id
},
{
  $pull: {
    "items": {
      _id: _id
    }
  }
})

字符串
Demo @ Mongo Playground

ccrfmcuu

ccrfmcuu2#

Mongoose有两种特定于Mongoose的方法来处理这种操作,第一种方法效率最低,但最容易理解。
1.使用MongooseArray.prototype.pull()
这是一个三步的过程,涉及到找到你想要的文档,从数组中拉取它,然后将它保存回数据库。因为你对db进行了两次调用,所以效率较低,但逻辑清晰:

// 1. Get the document that contains the object you want to delete
const document = await PartyModel.findOne({"items._id": _id});
// 2. Pull that object from the array
document.items.pull({_id: _id});
// 3. Save the changes
await document.save();

字符串
1.使用Model.findOneAndUpdate()
这是更有效的,因为它是一个单步过程,包括找到你想要的文档并传入一个update文档。该更新文档可以是一个mongodb操作,例如@Yong Shun answer中的$pull操作符。
findOneAndUpdateupdateOne之间的主要区别是findOneAndUpdate返回实际文档,无论是在您更新之前的状态还是在您更新之后的状态,这是您可以配置的。而updateOne返回更新状态文档,其中包含有用的属性,如acknowledgedmodifiedCount,但不包含任何文档数据字段或值。如果您需要将文档返回到前端,请使用findOneAndUpdate,否则没有区别:

const document = await PartyModel.findOneAndUpdate({
   'items._id': _id
},{
   $pull: {
      "items": {
         _id: _id
      }
   }
}, { new:true }); //< This option says return me the document after the changes are made

相关问题