Mongoose - Model.deleteOne () удаляет всю коллекцию вместо одного документа - PullRequest
0 голосов
/ 19 октября 2018

У меня есть модель 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 голосов
/ 19 октября 2018

Используя Mongoose, вы можете сделать это:

 model.findOneAndUpdate({ 'customer._id': custid }, {$pull: { $pull: { 
 customer: { _id: custid } }}, {new: true}).lean();

Удаление поддок.

Каждый поддокумент по умолчанию имеет _id.Массивы документов Mongoose имеют специальный метод id для поиска в массиве документов для поиска документа с заданным _id.

Посещение: https://mongoosejs.com/docs/subdocs.html

parent.children.id (_id) .remove ();

0 голосов
/ 19 октября 2018

deleteOne работает на уровне документа, поэтому ваш код удалит первый User документ, содержащий элемент customer с соответствующим _id.

Вместо этого вы хотите обновите пользовательские документы, чтобы удалить определенный элемент из поля массива customer, используя $pull.Чтобы удалить клиента из всех пользователей:

User.updateMany({}, { $pull: { customer: { _id: custid } } }, (err) => { ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...