Подтвердить что ты не робот

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

4b9b3361

Ответ 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, что это не буквальный, а скорее путь.