如何从模型中删除集合

时间:2018-05-31 08:33:32

标签: express mongoose

我想知道是否有一个函数来删除一个包含对象的集合。

我正在使用express.js和mongoose,我希望当我删除一个用户时,他的所有收藏品都将被删除。

我想知道是否存在来自express或mongoose的函数来删除它们。或者如果可以更好地实现我的代码。

我的问题在这里,我想删除该用户的所有地图。在sails.js中有一个名为destroy的函数,它从数据库中删除该用户的所有这些项目。

maps.forEach( (map) => {
   removeMaps(map);
});

这是我的代码:

app.delete('/:id', (req, res) => {

    var id = req.params.id;

    User.findOne({id}, (err, user) => {
        if (err) {
            return res.status(500).json({
                ok: false,
                message: 'Error removing user'
            });
        }

        if (!user) {
            return res.status(404).json({
                ok: false,
                message: 'Error finding user to remove'
            });
        }

        Map.find({owner: user.id})
        .exec( (err, maps) => {
            if (err) {
                return res.status(500).json({
                    ok: false,
                    message: 'Error findinf maps for user with id ' + user.id
                });
            }

            // Replace this for a function of express or mongoose
            maps.forEach( (map) => {
                removeMaps(map);
            });

            User.findByIdAndRemove(user._id, (err, removedUser) => {
                if (err) {
                    return res.status(400).json({
                        ok: false,
                        message: 'Error removing user by id'
                    });
                }

                return res.status(200).json({
                    ok: true,
                    user: removedUser
                });
            });

        });

    });
});

function removeMaps(item) {

    Map.findByIdAndRemove(item._id, (err, removedItem) => {
        if (err) {
            console.log('Error removing item with id '+ item.id);
        } else {
            console.log('Remove Success')
        }
    });
}

这是我的模特:

var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var userSchema = new Schema({
    id: { type: Number, required: true },
    name: { type: String, required: true },
    email: { type: String, unique: true, required: true },
    password: { type: String, required: true },

    maps: [{ type: Array, ref: 'map'}]
});

module.exports = mongoose.model('user', userSchema);

解决方案:感谢numer8er

// Delete User
app.delete('/:id', (req, res) => {

    var id = req.params.id;

    User.findOne({id}, (err, user) => {
        if (err) {
            return res.status(500).json({
                ok: false,
                message: 'Error removing user'
            });
        }

        if (!user) {
            return res.status(404).json({
                ok: false,
                message: 'Error finding user to remove'
            });
        }

        Map.deleteMany({owner: user.id})
        .then( () => {
                User.findByIdAndRemove(user._id, (err, removedUser) => {
                if (err) {
                    return res.status(400).json({
                        ok: false,
                        message: 'Error removing user with id '+ user.id
                    });
                }

                return res.status(200).json({
                    ok: true,
                    user: removedUser
                });
            });
        })
        .catch( (err) => {
            return res.status(400).json({
                ok: false,
                message: 'Error removing maps of user with id '+ user.id
            });
        });
    });
});

问题:

现在我的问题是当您删除用户在地图中包含的地图时。

地图是模型地图上的属性:{ type: Schema.Types.Array, ref: 'map'}

这样好吗?

// Remove Map
app.delete('/:id', (req, res) => {

    var id = req.params.id;

    Map.findOne({ id: id}, (err, map) => {
        if (err) {
            return res.status(500).json({
                ok: false,
                message: 'Error removing map'
            });
        }

        if (!map) {
            return res.status(400).json({
                ok: false,
                message: 'Map not found with id ' + id
            })
        }

        User.findOne({ id: map.owner}, (err, user) => {
            if (err) {
                return res.status(500).json({
                    ok: false,
                    message: 'Error finding map owner'
                });
            }

            if (!user) {
                return res.status(400).json({
                    ok: false,
                    message: 'Error map owner not exists with id ' + map.owner
                });
            }

            user.maps.splice(id, 1);

            Map.findByIdAndRemove(map._id, (err, removedMap) => {
                if (err) {
                    return res.status(400).json({
                        ok: false,
                        message: 'Error removing map by id'
                    });
                }

                user.save( (err, savedUser) => {
                    if (err) {
                        return res.status(500).json({
                            ok: false,
                            message: 'Error saving user on removing map'
                        });
                    }

                    return res.status(200).json({
                        ok: true,
                        map: removedMap
                    });

                });

            });
        });
    });
});

0 个答案:

没有答案