Як використовувати змінну як ім'я поля у 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.


Що робити, якщо ви хочете використовувати оператори, такі як $ gt, всередині запиту?
Savvas Parastatidis

Ви замінюєте valueсвоїм запитом на кшталт{ $gt: 50 }
maxdec

Як передати регулярний експрес, використовуючи наведене вище рішення var query = {}; запит [ім'я] = значення; ?
Рохіт Лутра,

3
Успіх var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ options": "m"};
Рохіт Лутра,

1
@levelone хтось був швидшим за мене :)
maxdec

58

Просто помістіть змінну в []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});

1
Ваша відповідь набагато пряма!
user523234

1
Це не працює як прямий запит mongo; ви отримуєте повідомлення про помилку E QUERY SyntaxError: Несподіваний маркер [ . Я не впевнений, як це може працювати в node.js?
Вінс Боудрен,

Я думаю, що причина в тому, що nodejs зробить трансформацію, коли взаємодіє з mongodb.
KiwenLau

ця робота над рідним диском mongodb для nodejs! Дякую!
Guihgo

Дякую! Це спрацювало в моєму набагато абстрактнішому коді, для якого прийнята відповідь не мала сенсу (для запису реагуйте не nodeJs).
adinutzyc21

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.