2017-03-20 3 views
3

우리는 컬렉션이 서버에있는 문서를 포함하고 있습니다. 각 문서는 다음과 같습니다 :MongoDB C# 드라이버를 사용하여 쿼리의 필드 포함/제외 2.4

{ _id: "...", Prop1: "", Prop2: "", Prop3: "", LargeField: "", ... } 

다른 많은 입력란이 있지만 클라이언트에서는 필요하지 않습니다. 내가 해봤

public class MyDoc { 
    public string Id { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public string Prop3 { get; set; } 
    public string LargeField { get; set; } 
} 

:

나는 누구의 정의입니다 MyDoc 클래스로 문서를로드 할

var client = new MongoClient(uri); 
var database = client.GetDatabase("MyDatabase"); 
var collection = database.GetCollection<MyDocs>("MyDocs"); 
var allDocs = collection.Find().ToList(); 

는 그 다음 각 문서에 대한 모든 필드를로드, 그래서에 있습니다 MyDoc[BsonIgnoreExtraElements]을 입력하십시오. 여기서 문제는 문서가 큽니다. 그러나 필자는 필드의 부분 집합 만 필요합니다. 클래스에 정의 된 필드 만 필요하다는 것을 드라이버에게 알릴 수 있습니까?

그렇지 않은 경우 결과 집합을 더 작게 만들려면 LargeField과 같은 일부 필드를 제외 할 수 있습니까? 나는 시도했다 :

var fieldsBuilder = Builders<MyDoc>.Projection; 
var fields = fieldsBuilder.Exclude(d => d.LargeField); 
var allDocs = collection.Find().Project(fields).ToList(); 

하지만 지금 allDocsBsonDocument 목록 대신 MyDoc 목록이됩니다. 프로젝션으로 MyDoc을 어떻게 쿼리합니까?

누군가 도움을 줄 수 있습니까? 그것은 레거시 MongoDB 드라이버에서 다소 단순하지만 새로운 드라이버에서 어떻게 해야할지 모르겠습니다. 감사.

답변

2

나는 비슷한 문제가 있었는데, 나는 당신이 범용 타입을 지정할 필요가 있다고 생각한다. 왜냐하면 어떤 이유로 프로젝트는 BsonDocument를 자동으로 가정하기 때문이다. 이렇게하면 BsonDocument에서 클래스로 수정됩니다.

변경 : 당신이 (포함하여) 빌더를하고있는 것처럼

var allDocs = collection.Find<MyDoc>().Project<MyDoc>(fields).ToList(); 

는 특정 필드를 포함하는 방법에 관해서는, 이것은 단지 수행 할 수 있습니다 또는과 :

var allDocs = collection.Find().Project(fields).ToList(); 

으로 json 형식의 문자열은 다음과 같습니다.

var allDocs = collection.Find<MyDoc>().Project<MyDoc>("{Prop1: 1, Prop2: 1}").ToList(); 

이 사람의 p에 대한 예측을 확인하는 것이 좋습니다. OST : https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

이 문서에서는 :

이 다른 차이를 우리에게 가져다 : 투사 정의와,이 암시 적으로 학생에서 BsonDocument에 문서 유형을 변환, 그래서 우리가 얻을 것은 유창 객체이다 결과적으로 BsonDocument가됩니다 (우리가 작업하는 것이 Student 유형 임에도 불구하고). 학생과 함께 일하기를 원한다면 우리는 여전히 학생에게 유형을 유지하고 싶다는 표시가 있어야합니다.