Inf*_*Dev 9 mongoose mongodb node.js express mongodb-query
我正在使用以下堆栈创建一个 webapp:
我已将应用程序构建为 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)
归档时间: |
|
查看次数: |
1624 次 |
最近记录: |