mongodbネイティブの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 2018

回答:


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 2016

次のvalueようなクエリに置き換えます{ $gt: 50 }
maxdec 2016

上記のソリューションを使用して正規表現を渡す方法varquery = {}; query [name] = value; ?
Rohit Luthra 2017

3
var query = {};に成功しました query ['registrationNo'] = {"$ regex":sCode、 "$ options": "m"};
Rohit Luthra 2017

1
@levelone誰かが私より速かった:)
maxdec 2018

57

変数を[]に入れるだけです

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

1
あなたの答えは非常に簡単です!
user523234 2016年

1
これは、直接のmongoクエリとしては機能しません。エラーが返されますEQUERY SyntaxError:Unexpected token [。node.jsでどのように機能するかわかりませんか?
Vince Bowdren 2016年

その理由は、nodejsがmongodbと対話するときに変換を行うためだと思います。
KiwenLau 2016年

これはnodejsのネイティブmongodbドライブで動作します!ありがとう!
Guihgo 2016

ありがとうございました!これは、受け入れられた答えが意味をなさない私のはるかに抽象的なコードで機能しました(記録のために、nodeJではなく反応します)。
adinutzyc21 2016

7

このドキュメントのフィールド「名前」をクエリする場合のように、ネストされたフィールドのみ(値ではない)に関するクエリを実行しようとしている場合は、次のことを明確にしておきます。

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

これは機能します(私の場合のように-updateを使用して):

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.