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