javascript - 使用 mongoose/MongoDB 中间件删除引用的文档(2021 年)

标签 javascript node.js mongodb express mongoose

我尝试了所有与使用 node.js 在 MongoDB 中删除引用文档相关的堆栈溢出解决方案。但他们中的大多数要么有不推荐使用的方法的解决方案,而且其中一些根本不起作用。
我有两个型号,ParentChildone-to-many关系。父文档包括引用的子文档 ID 的数组,如以下架构所示。

//file => parent.js 

const parentSchema = new mongoose.Schema({
  parentName: {
    type: String,
  },
  childrens : [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Children'
    }
  ]
});

const Parent = mongoose.model("Parent", parentSchema);
module.exports = Parent ; 

下一个文件有 children型号为 childrenSchema.pre()成功触发的中间件或钩子(Hook) -
//file => children.js 

const mongoose = require("mongoose");
const Parent  = require("./parent"); 


const childrenSchema = new mongoose.Schema({
  childrenId: Number,
  info: String,
  type: String, 
});


childrenSchema.pre('findOneAndDelete', async function(next) {
  console.log('trigger when middleware runs' , this.getQuery()["_id"]) ; 

  const childrenId = new mongoose.Types.ObjectId(this.getQuery()["_id"])
  await Parent.updateOne({} , { $pull: { childrens: { _id: childrenId }}});
  next()
}) 


const Children = mongoose.model("Children", childrenSchema);
module.exports = Children ; 

现在,最后这是我要删除 childrenId 实例的路由。 .
我有很多错误,但主要是说 Parent.updateOne()不是上述文件中的函数。但是当执行以下路由时,中间件会成功触发。
// route which performs delete action and triggers mongoose middleware

router.delete('/delete/instance' , async(req,res) => {
  const childrenId = new mongoose.Types.ObjectId('612cd0d8f9553c9f243db691')
  
  const deletedInstance = await Children.findOneAndDelete(
      { _id: childrenId}
  )
  res.json(deletedInstance)

})

最佳答案

请注意,您正在尝试执行 updateOne()没有过滤器选项。对于逻辑本身,你为什么不把它放在路由器里面:

const Parent  = require("./parent"); 

router.delete('/delete/instance' , async (req,res) => {
  await Parent.updateOne({ childrens: '612cd0d8f9553c9f243db691' }, { $pull: { childrens: '612cd0d8f9553c9f243db691' }})
  const deletedInstance = await Children.findOneAndDelete({ _id: '612cd0d8f9553c9f243db691'})
  res.json(deletedInstance)
})

关于javascript - 使用 mongoose/MongoDB 中间件删除引用的文档(2021 年),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68987607/

相关文章:

javascript - 添加到整个类的 offsetHeight

javascript - Jquery Ajax 加载另一个包含 jquery 库的页面

JavaScript 数学错误

node.js - 如何防止 Google Cloud VM 实例对 Firebase 数据库中的一个事件进行多次 react ?

node.js - 当我尝试使用工作 URL 连接到同一个数据库时,Mongoose 永远不会返回它的 promise

node.js - 如何保护API路由?

javascript - 没有字段名称的 Mongoose 结构聚合输出

java - 如何在 Spring Batch 中使用 MongoItemWriter 更新和插入文档?

javascript - 从 AJAX 检索对象列表中的对象打印特定属性?

mongodb - 使用 mongodb(多对多)实现进行图书标记