如何让Monk的findOneAndUpdate方法使用变量作为属性名?
如何在MongoDB的findOneAndUpdate中使用变量作为查询条件的属性名
这是JavaScript对象字面量的典型误区,我之前也踩过这个坑!当你直接写{type: value}的时候,JavaScript会把type当成固定的字符串键名,而不是读取变量type的值。所以哪怕你把type设为"apple",实际传入的查询条件还是{type: value},自然匹配不到你想要的文档。
给你两种可行的解决方案:
方案1:使用ES6计算属性名(推荐)
这是最简洁的写法,直接用方括号包裹变量,让JavaScript把变量的值作为键名:
let type = "apple"; let result = await collection.findOneAndUpdate( { [type]: value }, // 这里的[type]会解析为变量type的值,也就是"apple" { $set: { blacklisted: false } } );
方括号会计算内部的表达式,把结果作为对象的键,这样就生成了你需要的{apple: value}查询条件。
方案2:先创建对象再动态赋值
如果你的环境不支持ES6(虽然现在很少见了),可以用这种传统方式:
let type = "apple"; // 先创建空对象 let queryCondition = {}; // 动态添加键值对,这里的type变量会被解析为它的值 queryCondition[type] = value; let result = await collection.findOneAndUpdate( queryCondition, { $set: { blacklisted: false } } );
另外,你之前尝试的let obj = {type, value}是ES6的属性简写语法,它等价于{type: type, value: value},也就是生成了一个包含type和value两个键的对象,这显然不是你需要的查询条件,所以才会无效。
你可以在调用findOneAndUpdate之前,用console.log打印一下生成的查询对象,确认它的结构是否正确,这样更容易排查问题~
内容的提问来源于stack exchange,提问作者Jack Crispy
相关产品推荐
相关产品推荐

