Как использовать переменную в качестве имени поля в mongodb-native findOne ()?

88

У меня есть эти данные в 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, сохраняя как имя поля, так и его значение динамически?

Уилл Макэвой
источник
Только что нашел этот пост. Я считаю, что это действительно небезопасно. Вам не кажется, что перед использованием этих значений в запросе следует провести дезинфекцию?
McStuffins

Ответы:

140

Вам необходимо динамически установить ключ объекта запроса:

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.

maxdec
источник
Что, если вы хотите использовать внутри запроса такие операторы, как $ gt?
Саввас Парастатидис
Вы заменяете valueзапросом вроде{ $gt: 50 }
maxdec
Как передать обычный экспресс с помощью решения выше var query = {}; запрос [имя] = значение; ?
Рохит Лутра
3
У меня получилось var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ options": "m"};
Рохит Лутра
1
@levelone кто-то был быстрее меня :)
maxdec 02
57

Просто поместите переменную в []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
KiwenLau
источник
1
Ваш ответ очень прост!
user523234
1
Это не работает как прямой запрос mongo; вы получите сообщение об ошибке E QUERY SyntaxError: Unexpected token [ . Я не уверен, как это может работать в node.js?
Винс Боудрен,
Я думаю, причина в том, что nodejs будет выполнять преобразование, когда взаимодействует с mongodb.
KiwenLau
эта работа на родном диске mongodb для nodejs! Благодарность!
Guihgo 01
Спасибо! Это сработало в моем гораздо более абстрактном коде, для которого принятый ответ не имел смысла (для записи, реагируйте, а не nodeJs).
adinutzyc21 03
7

Я хотел бы пояснить, что если вы пытаетесь сделать запрос только относительно вложенного поля (а не его значения), например, если вы хотите запросить поле «имя» из этого документа:

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

это будет работать (как в моем случае - с использованием обновления):

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

Простое [query]заключение в скобки говорит mongodb, что это не буквальный, а скорее путь.

гидрикс
источник
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);
});
Анкит Кумар Раджпут
источник
Это помогло, я использовал, 'name.${surname}'но для переменной, которую мы не используем ', спасибо
1UC1F3R616