我有2个mongoose Collection (用户和财产).一个用户可以有多个属性,多个用户可以有相同的属性. 删除用户时,我想删除其引用的属性(仅删除其他用户未引用的属性).

这是两个系列

Model/User.js

const userSchema = new mongoose.Schema({
  first_name: { type: String, default: null },
  last_name: { type: String, default: null },
  email: { type: String, unique: true },
  password: { type: String },
  token: { type: String },
  properties: [{ type: Schema.Types.ObjectId, ref: 'property' }]
});

userSchema.post('findOneAndDelete', function(doc) {
  Property.deleteMany({_id: { $in: doc.properties }});
});

module.exports = mongoose.model("user", userSchema);

Model/Property.js

const propertySchema = new mongoose.Schema({
  name: {
    type: String,
    unique: true
   },
  type: {
    type: String,
    enum: ['house', 'apartment', 'room' ,'parking', 'pool']
  },
  numberOfBedrooms: { type: Number },
  numberOfBathrooms: { type: Number },
  maxNumberOfGuests: { type: Number }
});

module.exports = mongoose.model("property", propertySchema);

在我的用户控制器上,当我try 使用findOneAndDelete时,它会激活"findOneAndDelete"的POST,但不会删除引用的属性.你知道为什么吗? 您知道如何只删除其他地方未引用的属性吗?

非常感谢! 路易

推荐答案

试试await Property.deleteMany({_id: { $in: doc.properties }})吧.Property.deleteMany()返回thenable,需要用await.then()调用,这与常规的promise 不同.我相信你在Mongoose里也可以用.exec().

Node.js相关问答推荐

利用Gemini:通过Vertex AI还是通过Google/generative-ai?

即使DDB键不存在, node Lambda也不会失败,并返回NULL作为结果

如何将我的Redis客户端配置为在禁用群集模式的情况下使用读取副本?

是否可以在MongoDB中比较和匹配引用文档中的字段

关于Node.js中的AES加密库的问题

控制台显示一个长对象,我可以';每当我发布更新Mongoose数据库的请求时,我都不知道错误是什么,

Nestjs重写子类dto nodejs中的属性

如何从 Mongo Atlas 触发器向 GCP PubSub 发出经过身份验证的请求

运行 cypress 测试时如何指定 .env 文件用于我的开发服务器?

在 Node JS 中使用 url 链接而不是文件路径

如何在不使用位置运算符 $ 的情况下更新 mongodb 文档中数组中的嵌套文档?

在 Express.js 中迭代子文档数组

Azure Function 在 2022 年 4 月 26 日禁用将用户字段设置为 HTTP 请求对象

如何使用 mocha.js 模拟用于单元测试的依赖类?

判断一个数组中的每个元素是否都在第二个数组中

Nodejs 随机免费 tcp 端口

如何在 Node.js 中使用 chmod

安装 node 包时可以使用自定义目录名称而不是node_modules吗?

从 JavaScript 文件或 REPL 中 require()'ing CoffeeScript 文件

桌面应用程序仅支持 oauth_callback 值 'oob'/oauth/request_token