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 = {}; 쿼리 [이름] = 값; ?
Rohit Luthra

3
성공 var query = {}; query [ 'registrationNo'] = { "$ regex": sCode, "$ options": "m"};
Rohit Luthra

1
@levelone 누군가가 나보다 빠르다 :)
maxdec

57

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

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 구문 에러를 . node.js에서 어떻게 작동하는지 잘 모르겠습니까?
Vince Bowdren 2016

그 이유는 nodejs가 mongodb와 상호 작용할 때 변형을 수행하기 때문이라고 생각합니다.
KiwenLau 2011

이 작업은 nodejs 용 네이티브 mongodb 드라이브에서 작동합니다! 감사!
Guihgo

감사합니다! 이것은 받아 들인 대답이 의미가없는 훨씬 더 추상적 인 코드에서 작동했습니다 (기록을 위해 nodeJ가 아닌 반응).
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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.