【问题标题】:How to use a variable as a field name in mongodb-native findOne()?如何在 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,同时保持字段名称及其值是动态的?

【问题讨论】:

  • 刚刚找到这篇文章。我认为这真的很不安全。您不认为在查询中使用这些值之前应该进行清理吗?

标签: node.js mongodb express


【解决方案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}',但对于变量我们不使用',谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2017-01-07
    • 1970-01-01
    相关资源
    最近更新 更多