如何在mongodb-native findOne()中使用变量作为字段名称?


88

我在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保持字段名称及其值动态?


刚找到这篇文章。我认为这确实是不安全的。您是否不认为应该在查询中使用这些值之前进行清理?
McStuffins

Answers:


140

您需要动态设置查询对象的键:

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等运算符怎么办?
Savvas Parastatidis

您可以用value查询替换,例如{ $gt: 50 }
maxdec

如何使用上述解决方案传递正则表达式var query = {}; 查询[名称] =值;?
Rohit Luthra

3
我成功了var query = {}; query ['registrationNo'] = {“ $ regex”:sCode,“ $ options”:“ m”};
Rohit Luthra

1
@levelone有人比我快:)
maxdec

57

只需将变量放入[]

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});

1
您的答案很简单!
user523234 '16

1
这不适用于直接的mongo查询;您返回错误E QUERY SyntaxError:意外令牌[。我不确定它如何在node.js中工作?
文斯·鲍德伦

我认为原因是nodejs与mongodb交互时会进行转换。
KiwenLau

这项工作在用于nodejs的本地mongodb驱动器上!谢谢!
Guihgo '16

谢谢!这在我的更为抽象的代码中起作用,对于该代码而言,可接受的答案没有任何意义(就记录而言,不响应nodeJs)。
adinutzyc21 2016年

7

我想澄清一下,如果您要尝试仅查询嵌套字段(而不是其值),例如要从此文档中查询字段“名称”:

{
    loc: [0, 3],
    unit: {
        name : "playername"
    }
}

这将工作(如我的情况-使用更新):

mdb.cords.updateOne(
    {_id: ObjectID(someid)}, 
    {$set: {[query]: newValue}}, 
    function (err, result) {
        ...
    }
}

只需将[query]括号括起来就可以告诉mongodb,它不是文字,而是路径。


2

如果对象是嵌套的,请像这样使用。

直接宾语:-

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}'但对于变量我们不使用',谢谢
1UC1F3R616
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.