2011-11-29 3 views
1

C# 드라이버를 통해 저장된 문서가 있습니다. SortedList의 속성을가집니다.MongoDB에서 컬렉션 전체를 쿼리하는 중

다음 Things
{ 
    "_id": { 
    "$oid": "47f1f704c42f56380ac80000" 
    }, 
    "Things": { 
    "abc": { 
     "Color": "blue", 
     "Shape": "square", 
    } 
    "def": { 
     "Color": "red", 
     "Shape": "circle" 
    } 
    } 
} 

SortedList이며, MyClassColorShape의 속성이 있습니다 여기에 문서가 MongoDB를 찾습니다 방법입니다. 문제는 Things 안에 쿼리하려고하는 것입니다.

특히, 내가 원하는 것은 특정 색상을 가진 모든 MyClass의 색을 설정하는 것입니다. 나는 그것이 동적 인 필드 이름 인 것처럼 보이는 것에 색인이 붙여 졌기 때문에 그것을하는 방법을 이해할 수 없다.

답변

0

'abc'와 'def'는 무엇입니까? SortedList의 직렬화를 시도하지 않았습니다. List of T를 사용하면 여기에 포함 된 문서 대신에 임베디드 배열이 생성됩니다.

도트 표기법을 사용하여 포함 된 문서와 배열을 쿼리 할 수 ​​있지만 여기서는 Things.abc.Color 또는 Things.def.Color를 수행해야합니다.

+0

예, 클래스 목록 일 경우 어떻게 작동하는지 이해합니다. 하지만 여기는 입니다. 따라서 문자열 값을 키 (abc, def)로 끝냅니다. 그래서 점 표기법을 사용할 수 없습니다. 왜냐하면 수천 개의 표식이 있고 각각에는 고유 한 문자열 키가 있기 때문입니다. 필자가 정말로 필요한 것은 자리 표시 자이므로 Things.X.Color를 쿼리 할 수 ​​있습니다. 여기서 X는 어떤 것과도 일치합니다. – user1070663

+0

이런 식으로 SortedList를 사용하여 쿼리 할 수는 없습니다. 그런 와일드 카드를 사용할 수 없습니다. – Joe

1

가장 좋은 방법은 문서 구조를 변경하는 것일 수 있습니다.

"things"키가 MyClass의 배열을 가리키고 키를 사용할 때 사용했던 것을 가져 와서 배열의 문서 이름 키로 만듭니다.

{ 
    "_id": { 
    "oid": "47f1f704c42f56380ac80000" 
    }, 
    "Things": [ 
    { 
     "Name": "abc", 
     "Color": "blue", 
     "Shape": "square", 
    }, 
    { 
     "Name": "def", 
     "Color": "red", 
     "Shape": "circle" 
    } 
    ] 
} 

당신은 당신이 이런 식으로 쿼리와 일치하는 것들 배열의 첫 번째 MyClass 업데이트 할 위치 연산자를 사용할 수있는 방법 문서 설정이 있으면 :

db.things.update({ "Things.Color": "blue" }, {$set: {"Things.$.Color": "red"} })

당신이 원하는 경우에를 일치하는 모든 항목을 변경하십시오. 실제로 물어 본 것, 배열의 Things를 반복하는 $ where 쿼리를 수행해야합니다.

관련 문제