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

Posted

技术标签:

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

【问题讨论】:

刚刚找到这篇文章。我认为这真的很不安全。您不认为在查询中使用这些值之前应该进行清理吗? 【参考方案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',但对于变量我们不使用',谢谢

以上是关于如何在 mongodb-native findOne() 中使用变量作为字段名?的主要内容,如果未能解决你的问题,请参考以下文章

在 mongodb-native NodeJS 中为每个子进程使用集群的单个连接池与多个连接池

如何使用猫鼬 findOne

我应该如何将 JpaRepository.findOne() 与 SpringBoot 一起使用?

如何使用mongoose findOne

如何模拟像findOne()这样的mongoose查询?

如何使用 MongoDB 聚合 `$lookup` 作为 `findOne()`