C#

0

을 사용하여 mongodb의 중첩 배열에서 특정 필드를 선택하십시오. 내 응용 프로그램이 .net C# 드라이버를 사용하여 mongodb에 액세스합니다.C#

내 데이터 구조는 다음과 같습니다

{ 
"_id" : ObjectId("53d97351e37f520a342e152a"), 
    "Name" : "full question test 2", 
    "keywords" : ["personality", "extraversion", "agreeableness"], 
    "Questions" : [{ 
    "type" : "likert", 
     "text" : "question 1", 
     }, 
     { 
     "type" : "likert", 
     "text" : "question 2", 
     }] 
} 

내가하고 싶은 것은 질문의 배열 유형 만 열을 선택하는 것입니다.

여기 지금 내 LINQ 코드 :

from e in collection.AsQueryable<scales>() 
where e.Name == "full question test 2" 
select new { e.Id, e.Name, e.Questions} 

이 모든 질문의 특성 (유형과 텍스트 모두)을 반환합니다. 나는 그저 그런 종류의 것을 원한다. e.Questions [0] .text, e.Questions [1] .text와 같은 것을 말하면됩니다.

그러나 질문의 ​​수는 파일마다 다르므로이 수동 코딩이 필요없는 솔루션을 좋아합니다.

아이디어로 열기!

답변

1

여기서 래핑 된 표준 쿼리 메서드는 필드 선택에 "투영"형식을 사용할 수 있지만 배열 요소 내에서 특정 필드를 선택하는 등의 작업을 수행 할 수는 없습니다. 적어도 여러 필드에 대해서는 어쨌든.

그러나 하나의 필드는 요소에 액세스 할 점 표기법 양식을 사용하여 가능해야한다 :

아무것도하기 위해
from e in collection.AsQueryable<scales>() 
where e.Name == "full question test 2" 
select new { e.Id, e.Name, e.Questions.type } 

더는 통합 프레임 워크를 사용할 수 있습니다 돌기의 형태를 필요로하는 곳에 당신을 " 쿼리 "및"프로젝션 "은 파이프 라인에 대해 $match$project 연산자를 사용하여 BSON 문서로 표시됩니다. 쉘 형태로는 다음과 같습니다

db.collection.aggregate([ 
    { "$match": { 
     "Name": "fullquestion test 2" 
    }}, 
    { "$project": { 
     "Name": 1, 
     "Questions.type": 1 
    }} 
]) 

또는 BSON의 C ​​번호 문서 구성과 : 단지 선택 기본적으로

var match = new BsonDocument { 
    { "$match",new BsonDocument { 
      { 
       "Name", "full question test 2" 
      } 
     } 
    } 
}; 

var project = new BsonDocument { 
    { "$project", new BsonDocument { 
      { "Name", 1 }, 
      { "Questions.type": 1 }   
     } 
    } 
}; 

var pipeline = new [] { match, project }; 
var result = collection.aggregate(pipeline); 

,보다 더 많은 일을 할 수 집계 파이프 라인의 $project 단계 전지. 여기서 추가로 지원되는 기능을 통해 배열 내부의 문서 구조를 "변경"하는 것과 같은 작업을 수행 할 수 있습니다.

Linq에 대한 집계 파이프 라인 매핑 지원이 진행 중입니다. 여기에서 문제를 모니터링 할 수 있습니다. CSHARP-601

+1

정말 있습니까? db.collection.find ({ "Name": "fullquestion test 2"}, { "Name": 1, "Questions.type": 1})'같은 결과를 반환합니다. 아니면 C# 일입니까? –

+0

@JustinCase 자동 조종 장치에 두뇌. 단일 필드이므로 옳았고 표준 투영법은 단일 필드에서 작동해야합니다. 아직도 여러 분야에서 생각하고 있습니다. –

+0

빠른 응답을 보내 주셔서 감사합니다! 불행히도 점 표기법 (id.Questions.type) doesnt 작동 :("System.Array에 'type'정의가 없습니다"라는 오류 메시지가 나타납니다. – AlexKogan