为什么我的node.js端点用于将数据保存到数组中会在修改数据时引发错误?

时间:2016-09-16 07:56:51

标签: javascript node.js mongoose

在我的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'

如何修改我的端点,以便它涵盖添加/删除主题标签的可能性?

1 个答案:

答案 0 :(得分:1)

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

您有两种可能性来实现您想要的目标:

选项1

  1. 获取用户(使用findOne
  2. user.hashtags属性
  3. 手动添加和删除主题标签
  4. 使用hashtags运算符更新用户$set属性。
  5. 示例:

    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 但是没有计划实施它。

    相关问题: