此REST端点通过从qname
删除user.favourites
来更新数据库中的收藏夹列表。
我的问题是虽然updatedUser.favourites
在代码末尾是正确的,但实际上并没有在数据库中保留(类似的代码在单独的端点上添加qname可以正常工作)。我确定这是一个愚蠢的错误,但我所写的内容在直觉上是正确的。
exports.remQname = function (req, res, next) {
var userId = req.user.id;
var qname = req.params.qname;
console.log('addQname %s %s', userId, qname);
User.findOne({
_id: userId
}, function(err, user) {
if (err) return next(err);
if (!user) return res.json(401);
console.log(user);
// if the qname already in list, remove it, otherwise add it
var favourites = user.favourites;
var matches = _.remove(favourites, function (f) {
return f == qname
});
console.log('Matches: %s %s', matches, favourites);
user.favourites = favourites;
user.save(function(err, updatedUser){
if (err) throw err;
console.log(updatedUser); // correct info, but does not reflect database content
res.status(200).send(updatedUser.favourites);
});
});
};
这是我的架构
var UserSchema = new Schema({
email: String,
password: String,
token: String,
role: {type: String, default: 'user'},
favourites: Array
});
module.exports = mongoose.model('User', UserSchema);
答案 0 :(得分:2)
您可以使用$pull
直接从数组字段中删除特定值的所有实例,因此让MongoDB完成工作而不是尝试自己操作数组会更有效。
User.update({_id: userId},
{$pull: {favourites: qname}},
function(err, numberAffected, raw) { ... });
我还建议将架构中favourites
的定义更改为[String]
,而不仅仅是Array
,如果它确实包含字符串数组。
答案 1 :(得分:1)
它与lodash有关 - 这可以改为
var newFavs = _.reject(user.favourites, function (f) {
return f == qname
});
console.log('Favourites - Old: %s New: %s', user.favourites, newFavs);
// delete user.favourites;
user.favourites = newFavs;