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') }
  ],
}

我正在try 访问内部数组(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方法.

推荐答案

Mongoose有两种特定于Mongoose的方法来处理这种操作.第一种方法效率最低,但最容易理解.

  1. 使用MongooseArray.prototype.pull()

这是一个包含三个步骤的过程,包括查找所需的文档、从数组中提取文档,然后将其保存回数据库.由于您对数据库进行了两次调用,因此效率较低,但逻辑上清晰可读:

// 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会以您更新前的状态或您更新后的状态(可由您配置)返回return the actual document.然而,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

Javascript相关问答推荐

JavaScript寻求、寻求和时间更新事件||Mux

判断现代浏览器中的点击是否由touch 触发

复合密钥查找在mongoDB中未按预期工作

Toast函数找不到其dis

使用typeof运算符获取对象值类型-接收字符串而不是数组

JavaScript文本区域阻止KeyDown/KeyUp事件本身上的Alt GR +键组合

如何修复内容安全策略指令脚本-SRC自身错误?

RxJS setTimeout操作符等效

具有相同参数的JS类

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

在带有背景图像和圆形的div中添加长方体阴影时的重影线

使用JQuery单击元素从新弹出窗口获取值

实现JS代码更改CSS元素

JSDoc创建并从另一个文件导入类型

不能将空字符串传递给cy.containes()

在Matter.js中添加从点A到另一个约束的约束

使用NextJS+MongoDB+Prisma ORM获取无效请求正文,无法发布错误

如何在我的Next.js项目中.blob()我的图像文件?

如何利用CSS中的隐藏元素实现平滑扩展和防止网格行间隙

JavaScript&;Reaction-如何避免在不使用字典/对象的情况下出现地狱?