我有一个包含一系列客户的User模型。我想基于customer _id
删除特定的客户。根据我在Mongoose文档中阅读的内容,我应该使用Model.deleteOne
删除一个文档。
这是我的尝试
用户架构(为简便起见已被缩短):
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
username: {
type: String,
default: ''
},
password: {
type: String,
default: '',
},
registerDate: {
type: Date,
default: Date.now()
},
customer: [{
name: {
type: String,
default: '',
},
email: {
type: String,
default: 'No email name found'
},
fleet: [{
unitNumber: {
type: String,
default: 'N/A',
}
}]
}]
});
module.exports = mongoose.model('User', UserSchema);
下面是路由和控制器的说明:
const express = require('express');
const router = express.Router();
const customer_controller = require('../../controllers/customers');
router.delete('/customers/:custid', customer_controller.customer_remove);
module.exports = router;
最后是控制器:
exports.customer_remove = (req, res) => {
const { params } = req;
const { custid } = params;
User.deleteOne({ 'customer._id': custid }, (err) => {
if (err)
throw err;
else
console.log(custid, 'is deleted');
});
};
根据我的想法,User.deleteOne({ 'customer.id': custid })
会找到customer _id
与通过custid
传递的req.params
匹配。当我在Postman中测试此路由时,它会删除在其中找到客户的整个User
集合,而不仅仅是删除客户。我可以朝正确的方向轻推吗?我觉得我在这里很近(或者不是笑)。
答案 0 :(得分:1)
deleteOne
在文档级别进行操作,因此您的代码将删除第一个User
文档,该文档包含具有匹配的customer
的{{1}}元素。
相反,您希望 update 用户文档使用$pull
从_id
数组字段中删除特定元素。要从所有用户中删除客户,请执行以下操作:
customer
答案 1 :(得分:0)
使用猫鼬,您可以这样做:
model.findOneAndUpdate({ 'customer._id': custid }, {$pull: { $pull: {
customer: { _id: custid } }}, {new: true}).lean();
删除子文档。
每个子文档默认都有一个_id。猫鼬文档数组具有特殊的id方法,用于搜索文档数组以查找具有给定_id的文档。
访问:https://mongoosejs.com/docs/subdocs.html
parent.children.id(_id).remove();