猫鼬-Model.deleteOne()删除整个集合,而不是单个文档

时间:2018-10-19 01:04:34

标签: javascript node.js mongodb express mongoose

我有一个包含一系列客户的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集合,而不仅仅是删除客户。我可以朝正确的方向轻推吗?我觉得我在这里很近(或者不是笑)。

2 个答案:

答案 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();