我想构建一个简单的函数,它可以更新(upsert
)文档collection name, field key, field value, updateData
例:
function updateDB(tableName, id, rowInfo, checkfield, callback) {
db.collection(tableName, function (err, collection) {
if (err) {
console.log(err);
} else {
console.log(checkfield);
collection.update({ checkfield: id }, rowInfo, { upsert: true }, function (err, objects) {
if (err) {
throw err;
callback(false);
} else {
// console.log(objects);
callback(true);
}
});
}
});}
但是,当我在更新查询中使用参数作为字段过滤器时,它总是插入新数据,而不会更新文档。例:
collection.update({ checkfield: id }.....
但是当我将字段过滤器更改为realFieldName
时,它可以正常工作。例:
collection.update({ 'realFieldName': id }....
两者有什么区别?
你应该像这样编码:
var filter = {};
filter[checkfield] = id;
collection.update(filter, ...);
定义一个像{ checkfield: id }
这样的对象,checkfield
被视为标识符而不是变量。
详情请参阅 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects
对象属性名称可以是任何有效的 JavaScript 字符串,或者 任何可以转换为字符串的内容,包括空的 字符串。但是,任何不是有效 JavaScript 的属性名称 标识符(例如,具有空格或连字符的属性名称, 或以数字开头)只能使用正方形访问 括号表示法。这种表示法在属性时也非常有用 名称是动态确定的(当属性名称不是 直到运行时确定)