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

时间:2013-06-11 07:50:21

标签: node.js mongodb express

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

4 个答案:

答案 0 :(得分:118)

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

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的值。

答案 1 :(得分:45)

只需将变量放入[]

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

答案 2 :(得分:6)

我想澄清一下,如果您尝试仅针对嵌套字段(而不是其值)进行查询,就好像您要查询字段" name"来自这份文件:

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

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

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

简单地将[query]括在括号中告诉mongodb它不是文字,而是路径。

答案 3 :(得分: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);
});