91

我在 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

4 回答 4

147

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

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

于 2013-06-11T08:26:30.120 回答
73

只需将变量放入 []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
于 2016-09-07T16:23:46.963 回答
7

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

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

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

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

简单地[query]用括号括起来告诉 mongodb 它不是文字,而是一条路径。

于 2016-09-01T06:47:42.420 回答
6

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

直接宾语:-

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);
});
于 2020-06-19T12:25:32.923 回答