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

Wil*_*voy 80 mongodb node.js express

我在mongodb中有这些数据:

{  
    "name": "Amey",
    "country": "India",
    "region": "Dhule,Maharashtra"
}
Run Code Online (Sandbox Code Playgroud)

我希望在将字段名称作为查询中的变量传递时检索数据.

以下不起作用:

var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
    res.send(item);
});
Run Code Online (Sandbox Code Playgroud)

如何查询mongodb保持字段名称及其值动态?

max*_*dec 126

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

var name = req.params.name;
var value = req.params.value;
var query = {};
query[name] = value;
collection.findOne(query, function (err, item) { ... });
Run Code Online (Sandbox Code Playgroud)

执行此操作时{name: value},键是字符串,'name'而不是变量的值name.

  • 我成功了var query = {}; query ['registrationNo'] = {"$ regex":sCode,"$ options":"m"}; (3认同)

Kiw*_*Lau 53

把变量放在[]中

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


hyd*_*rix 7

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

{
    loc: [0, 3],
    unit: {
        name : "playername"
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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


小智 5

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

直接宾语:-

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

嵌套对象:-

var surname=req.params.surname;
var value = req.params.value;
var condition = `name.${surname}`
collection.findOne({[condition]:value}, function(err, item) {
res.send(item);
});
Run Code Online (Sandbox Code Playgroud)