Как использовать переменную как имя поля в mongodb-native findOne()?
У меня есть эти данные в 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
Вам нужно установить ключ объекта запроса динамически:
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
.
Ответ 2
Просто поместите переменную в []
var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
Ответ 3
Я хотел бы пояснить, что если вы пытаетесь сделать запрос только для вложенного поля (а не его значения), например, если вы хотите запросить поле "имя" из этого документа:
{
loc: [0, 3],
unit: {
name : "playername"
}
}
это будет работать (как в моем случае - с помощью обновления):
mdb.cords.updateOne(
{_id: ObjectID(someid)},
{$set: {[query]: newValue}},
function (err, result) {
...
}
}
Просто заключая [query]
в скобках, говорит mongodb, что это не буквальный, а скорее путь.