2012-10-24 2 views
1

눈에 띄게 무언가를 놓치고 있어야합니다. 누군가 나를 부끄럽게 하소서.MongoDB 중첩 된 속성 이름 C#을 사용하여 중첩 된 속성을 만드는 방법 드라이버

저는 C# Linq 드라이버가 기본적으로 지원하지 않는 집계 쿼리 2.2를 작성했습니다. 따라서 점으로 구분 된 표기법을 사용하여 중첩 된 속성의 문자열 이름을 만들어야합니다. 이런 구조가 있다고 해봅시다.

db.so.insert({ 
    a:1, 
    b:2, 
    n : { 
     z:4, 
     x:5, 
     y: { 
      v:"value", 
     } 
    } 
}); 

는 그래서 "값"을 참조하기 위해 나는 이름 n.y.v 또는 n[y][v]을 사용해야합니다. 이제 웹 클라이언트 ( http://www.demo.org/exampleQuery?field1=n&field2=y&field3=v)에서 쿼리에 대한 필드 속성 이름을 선택 했으므로 속성 이름을 구성해야합니다.

var fieldNameForQuery = field1+"."+field2+"."+field3; 

나는 물론 내 입력 매개 변수를 살균하여 NOSQL 주입 방어하고있어,하지만 난 차라리 대신의 C#을 드라이버를 사용하는 것, 그래서 이것에 대해 분명히 불안 해요.

나는 뭔가를 좋아할 것이라고 생각한다; 나 자신을 써야했다했지만, 그것은 kludge 같은 느낌, 나는 오히려 이런 식으로 DB 안전 필드 이름을 구축하기위한 책임을 유지하지 않는 게 좋을 것 기본적으로

MongoDB.Driver.BuildNestedFieldName(field1, field2, field3)); 

.

답변

0

현재 원하는 기능을 수행 할 수있는 기능이 없습니다. 그러나 모든 기능이 중간에 있다면, 우리가 삽입하고있는 것들이 주입 될 수 없기 때문에 주입 문제를 해결할 수 없습니다. 주입 문제는 "field1", "field2"및 "field3"은 필드 이름에 유효한 값입니다. 물론 http://bsonspec.org/#/specification에 따르면 유효하지 않은 부분은 많지 않습니다. 우리가 검사해야 할 유일한 것은 문자열에 널 터미네이터가 2 개가 없다는 것입니다. 그래서 ... 우리가 할 수있는 것들을 많이 남겨 두지 않습니다.

의미가 있습니까?

+0

감사합니다. 그래서 나는 지금 현장 1 등을 위생 처리하고 있지만, "무효 한 것은별로 없다"라는 당신의 의견은 나를 놀라게합니다. 유효성 검사없이 문자열 연결을 사용하면 '\ "); db.col.remove();'와 같은 거의 모든 것을 주입 할 수 있습니다. – cirrus

+0

:) Mongodb는 SQL과 같은 방식으로 작동하지 않습니다. mongodb로는 그렇게 할 수 없으므로 걱정할 필요가 없습니다. 걱정할 필요가있는 것은 dropCollection 명령을 사용하여 사용자가 컬렉션 이름을 지정하도록 허용했지만 $ cmd 컬렉션 등을 삭제할 수있었습니다. 그러나 쿼리를 실행하기 때문에 문제가되지 않습니다. –

+0

사실 현재 집계를 작성 중입니다. 쿼리를 json 텍스트로 쿼리하므로이 텍스트로 들어가는 웹 입력을 위생적으로 처리해야합니다 기본적으로 쉘 호환 JS로 쿼리를 작성하고 런타임시 json 파이프 라인 배열 (텍스트)로 LoadResource()를 간단히 작성할 수 있습니다. 왜 내가 문자열 연결 된 필드 이름 "like.this.example"주입하고있다. 그러나이 접근법을 다시 생각하기 시작 해요하지만 JS 파일은 드라이버와 함께 파이프 라인 문을 구성하는 것보다 개발 시간으로 작업하기가 훨씬 쉽습니다. 우리는 적절한 linq supp를 가졌다. 오히려 그걸 사용하고 싶습니다. – cirrus