我想知道是否有一个函数来删除一个包含对象的集合。
我正在使用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
});
});
});
});
});
});