눈에 띄게 무언가를 놓치고 있어야합니다. 누군가 나를 부끄럽게 하소서.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));
.
감사합니다. 그래서 나는 지금 현장 1 등을 위생 처리하고 있지만, "무효 한 것은별로 없다"라는 당신의 의견은 나를 놀라게합니다. 유효성 검사없이 문자열 연결을 사용하면 '\ "); db.col.remove();'와 같은 거의 모든 것을 주입 할 수 있습니다. – cirrus
:) Mongodb는 SQL과 같은 방식으로 작동하지 않습니다. mongodb로는 그렇게 할 수 없으므로 걱정할 필요가 없습니다. 걱정할 필요가있는 것은 dropCollection 명령을 사용하여 사용자가 컬렉션 이름을 지정하도록 허용했지만 $ cmd 컬렉션 등을 삭제할 수있었습니다. 그러나 쿼리를 실행하기 때문에 문제가되지 않습니다. –
사실 현재 집계를 작성 중입니다. 쿼리를 json 텍스트로 쿼리하므로이 텍스트로 들어가는 웹 입력을 위생적으로 처리해야합니다 기본적으로 쉘 호환 JS로 쿼리를 작성하고 런타임시 json 파이프 라인 배열 (텍스트)로 LoadResource()를 간단히 작성할 수 있습니다. 왜 내가 문자열 연결 된 필드 이름 "like.this.example"주입하고있다. 그러나이 접근법을 다시 생각하기 시작 해요하지만 JS 파일은 드라이버와 함께 파이프 라인 문을 구성하는 것보다 개발 시간으로 작업하기가 훨씬 쉽습니다. 우리는 적절한 linq supp를 가졌다. 오히려 그걸 사용하고 싶습니다. – cirrus