Mongoose没有保存到数据库

时间:2015-03-07 10:12:35

标签: node.js mongodb mongoose

此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);

2 个答案:

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