为什么我的node.js端点保存数据到数组引发错误,而修改数据



在我的mongoose模式中,我有以下用于存储用户的模型:

var UsersSchema = new Schema({
    username: {type: String},
    our_username: {type: String},
    our_display_name: {type: String},
    hashtags: {type: [String]}
}

我想在node.js中创建一个端点,允许用户更新(添加/删除)这些标签,我的用例场景是,当用户登录到我的应用程序时,我用一个简单的get端点向他展示所有的标签:

usersRoutes.get('/:username/hashtags/', functions.validateRequestsGET, function(req, res){
    var username = req.params.username;
    var query;
    if(username != undefined) {
        query = User.find({}).where('username').equals(username).select('hashtags -_id');
    }
    query.exec(function(err, hashtags){
        if(err) {
            res.send(err);
            return;
        }
        res.json(hashtags);
    });
});

但是我如何创建一个允许用户添加/删除标签的端点呢?我试过了:

usersRoutes.post('/:username/', function (req, res) {
    var username = req.params.username;
    var hashtagsToAdd = req.body.hashtagsToAdd;
    var hashtagsToRemove = req.body.hashtagsToRemove;
    console.log(hashtagsToAdd);
    console.log(hashtagsToRemove);
    User.findOneAndUpdate(
        {username: username},
        {
            $push: {"hashtags": hashtagsToAdd},
            $pull: {"hashtags": hashtagsToRemove},
        },
        {safe: true, upsert: true},
        function(err, user) {
            if(err)
                console.log(err);
                return callback(err);
            res.json(user);
        }
    );
});

,我用它来发送这个:

{"hashtagsToRemove":["food"], "hashtagsToAdd":["something"]}

到我的端点:

http://localhost:3000/users/randomUsername/

但是会引发错误:

message: 'Cannot update 'hashtags' and 'hashtags' at the same time'

我如何修改我的端点,使其涵盖添加/删除标签的可能性?

您在MongoDB上同时做$pull$push,这是不允许的。

你有两种可能实现你想要做的事情:

选项1

  1. 获取用户(使用findOne)
  2. 手动添加和删除user.hashtags属性的标签
  3. 使用$set操作符更新用户hashtags属性

的例子:

User.findOne({username: username}, function (err, user) {
  user.hashtags = addToArray(user.hashtags, hashtagsToAdd);
  user.hashtags = removeFromArray(user.hashtags, hashtagsToRemove);
  user.save(function (err, updatedUser) {
    console.log('yeepee');
  });
});

addToArrayremoveFromArray留作练习;-)

选项2

您可以按顺序更新用户:第一次请求使用$push,在回调时,另一次使用$pull

特性请求

有一个打开的特性请求:https://jira.mongodb.org/browse/SERVER-1050但是没有实施它的计划。

相关问题:

  • Mongodb数组$push和$pull

  • 与mongo同时Pull和addtoset

  • 多个mongo更新操作符在一个单一的语句?

最新更新