web-dev-qa-db-ja.com

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にクエリを実行するにはどうすればよいですか?

78
WillMcavoy

クエリオブジェクトのキーを動的に設定する必要があります。

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の値ではありません。

122
maxdec

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

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

ネストされたフィールドのみ(値ではない)に関するクエリを作成しようとしている場合、たとえば、このドキュメントからフィールド "name"をクエリする場合などを明確にしたいと思います。

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

これは動作します(私の場合-アップデートを使用):

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

[query]を括弧で囲むだけで、mongodbにリテラルではなくパスであることがわかります。

6
hydrix