[node.js] 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를 쿼리하려면 어떻게해야합니까?



답변

쿼리 개체의 키를 동적으로 설정해야합니다.

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입니다.


답변

변수를 []에 넣으십시오.

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


답변

이 문서에서 “이름”필드를 쿼리하려는 경우와 같이 중첩 된 필드 (값이 아님)에 대해서만 쿼리를 수행하려는 경우 다음과 같이 명확히하고 싶습니다.

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

이것은 작동합니다 (내 경우-업데이트 사용).

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

단순히 [query]괄호로 묶으면 mongodb는 그것이 리터럴이 아니라 경로임을 알려줍니다.


답변

객체가 중첩 된 경우 이와 같이 사용하십시오.

목적어:-

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);
});


답변