我试图创建一个单独的函数来更新Mongoose模型中的不同类型的选项,并遇到这种奇怪的行为。 这就是我想要做的事情。
module.exports.updateUser = function(id, action, status, callback) {
const query = {
_id: id
};
let field = '';
switch (action) {
case 'download':
field = 'download_permission';
break;
case 'upload':
field = 'upload_permission';
break;
case 'view':
field = 'view_permission';
break;
case 'edit':
field = 'edit_permission';
break;
}
User.findOneAndUpdate(query, {
$set: {
field: status,
last_updated: moment().format('llll')
}
}, callback);
};
现在,如果我尝试这样的话:
User.findOneAndUpdate(query, {
$set: {
'edit_permission': status,
last_updated: moment().format('llll')
}
}, callback);
};
它实际上更新了mongodb中的文档。 有人可以解释为什么第二个工作,而不是第一个(不更新文档)。感谢。
答案 0 :(得分:2)
User.findOneAndUpdate(query, {
$set: {
problem ------->>>>field<<<<<: status,
last_updated: moment().format('llll')
}
}, callback);
字段对象参数不会解析为变量field
的值。
这应该解决它:
const setStatement = {
last_updated: moment().format('llll')
};
setStatement[field] = status;
User.findOneAndUpdate(query, {
$set: setStatement
}, callback);
答案 1 :(得分:2)
在ES6中,您可以使用括号表示法定义computed keys。
User.findOneAndUpdate(query, {
$set: {
[field]: status,
last_updated: moment().format('llll')
}
}, callback);
答案 2 :(得分:1)
我不认为你可以将变量作为键...如果你这样说......变量本身就变成了一个字符串并成为键......变量的值不会出现在键的位置< / p>