如果通过 Mongoose 在 Mongodb 中的另一个文档中存在引用,则有什么更好的方法可以防止文档被删除?

Inf*_*Dev 9 mongoose mongodb node.js express mongodb-query

我正在使用以下堆栈创建一个 webapp:

  • 节点
  • 表达
  • MongoDB
  • 猫鼬

我已将应用程序构建为 MVC 结构。

有 Customer、OrderReceived 和 OrderSent 模式。OrderReceived 和 OrderSent 架构引用客户架构。Abridge 模式结构如下:

顾客

const mongoose = require('mongoose');

const customerSchema = mongoose.Schema({
  companyName: String,
  firstName: { type: String, required: true},
  lastName: { type: String, required: true}
});

module.exports = mongoose.model('Customer', customerSchema);
Run Code Online (Sandbox Code Playgroud)

订单已经收到

const mongoose = require('mongoose');

const orderReceivedSchema = mongoose.Schema({
  receivedDate: { type: Date, required: true},
  customer: {type: mongoose.Schema.Types.ObjectId, ref: 'Customer', required: true}
});

module.exports = mongoose.model('OrderReceived', orderReceivedSchema);
Run Code Online (Sandbox Code Playgroud)

订单已发送

const mongoose = require('mongoose');

const orderSentSchema = mongoose.Schema({
  sentDate: { type: Date, required: true},
  customer: {type: mongoose.Schema.Types.ObjectId, ref: 'Customer', required: true}
});

module.exports = mongoose.model('OrderSent', orderSentSchema);
Run Code Online (Sandbox Code Playgroud)

当要求删除客户文档时,我想检查该文档是否被 OrderReceived 或 OrderSent 文档引用。如果存在,我想防止删除客户文档。

我想出的解决方案是在Customer的控制器中进行检查,如下:

CustomerController#destroy 处理删除请求:

destroy(req, res){
    OrderReceived.count({customer: req.params.id}, (error, orderLength)=>{
      if (error) res.send(error);
      if (orderLength<1){
        OrderSent.count({'customer.customer': req.params.id}, (error, orderLength)=>{
          if (error) res.send(error);
          if (orderLength<1){
            Customer.remove({_id: req.params.id}, error => {
              if (error) res.send(error);
              res.json({message: 'Customer successfully deleted.'});
            });
          } else {
            res.status(409).json({message: 'There are orders sent using the Customer. Datum could not be deleted'});
          }
        });
      } else {
        res.status(409).json({message: 'There are orders received using the Customer. Datum could not be deleted.'});
      }
    });
  }
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?我还有其他模型也依赖于客户文档,而这段代码只会变得更加混乱。请帮忙。

小智 0

您可以使用Promise.all方法一次执行所有数据库查询,如下所示:

Promise.all([
  OrderReceived.count({customer: req.params.id}),
  OrderSent.count({'customer.customer': req.params.id})
])
  .then(([orderReceivedCount, orderSendCount]) => {
    if (orderReceivedCount < 1 && orderSendCount<1) { 
      ...delete doc 
    }
   }).catch(error => ...handleError)
Run Code Online (Sandbox Code Playgroud)