如何在 mongodb-native findOne() 中使用变量作为字段名?
Posted
技术标签:
【中文标题】如何在 mongodb-native findOne() 中使用变量作为字段名?【英文标题】:How to use a variable as a field name in mongodb-native findOne()? 【发布时间】:2013-06-07 00:03:20 【问题描述】:我在 mongodb 中有这些数据:
"name": "Amey",
"country": "India",
"region": "Dhule,Maharashtra"
我想在查询中将字段名称作为变量传递时检索数据。
以下不起作用:
var name = req.params.name;
var value = req.params.value;
collection.findOne(name: value, function(err, item)
res.send(item);
);
如何查询 mongodb,同时保持字段名称及其值是动态的?
【问题讨论】:
刚刚找到这篇文章。我认为这真的很不安全。您不认为在查询中使用这些值之前应该进行清理吗? 【参考方案1】:需要动态设置查询对象的key:
var name = req.params.name;
var value = req.params.value;
var query = ;
query[name] = value;
collection.findOne(query, function (err, item) ... );
当您执行name: value
时,键是字符串'name'
而不是变量name
的值。
【讨论】:
如果要在查询中使用 $gt 等运算符怎么办? 你用 $gt: 50
这样的查询替换value
如何使用上述解决方案传递正则表达式 var query = ;查询[名称] = 值; ?
我成功了 var query = ; query['registrationNo'] = "$regex": sCode, "$options": "m" ;
@levelone 有人比我快 :)【参考方案2】:
只需将变量放入[]
var name=req.params.name;
var value = req.params.value;
collection.findOne([name]:value, function(err, item)
res.send(item);
);
【讨论】:
你的回答很直接! 这不能作为直接的 mongo 查询;你得到一个错误返回 E QUERY SyntaxError: Unexpected token [.我不确定它如何在 node.js 中工作? 我觉得原因是nodejs在和mongodb交互的时候会做转换。 这项工作适用于 nodejs 的本机 mongodb 驱动器!谢谢! 谢谢!这在我更抽象的代码中起作用,接受的答案没有任何意义(为了记录,反应不是 nodeJs)。【参考方案3】:我想澄清一下,如果您尝试仅对嵌套字段(而不是其值)进行查询,例如您想从该文档中查询字段“名称”:
loc: [0, 3],
unit:
name : "playername"
这会起作用(在我的情况下 - 使用更新):
mdb.cords.updateOne(
_id: ObjectID(someid),
$set: [query]: newValue,
function (err, result)
...
简单地将[query]
括在括号中告诉 mongodb 它不是文字,而是一条路径。
【讨论】:
【参考方案4】:如果对象是嵌套的,就这样使用。
直接对象:-
var name=req.params.name;
var value = req.params.value;
collection.findOne([name]:value, function(err, item)
res.send(item);
);
一个对象是嵌套的:-
var surname=req.params.surname;
var value = req.params.value;
var condition = `name.$surname`
collection.findOne([condition]:value, function(err, item)
res.send(item);
);
【讨论】:
这有帮助,我使用的是'name.$surname'
,但对于变量我们不使用',谢谢以上是关于如何在 mongodb-native findOne() 中使用变量作为字段名?的主要内容,如果未能解决你的问题,请参考以下文章
在 mongodb-native NodeJS 中为每个子进程使用集群的单个连接池与多个连接池