在我的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
- 获取用户(使用
findOne
) - 手动添加和删除
user.hashtags
属性的标签 - 使用
$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');
});
});
addToArray
和removeFromArray
留作练习;-)
选项2
您可以按顺序更新用户:第一次请求使用$push
,在回调时,另一次使用$pull
。
特性请求
有一个打开的特性请求:https://jira.mongodb.org/browse/SERVER-1050但是没有实施它的计划。
相关问题:
-
Mongodb数组$push和$pull
-
与mongo同时Pull和addtoset
- 多个mongo更新操作符在一个单一的语句?