2017-01-12 1 views
2

다음과 같이 TypeOfBar == "Big" 바를 포함하는 모든 Foos를 Foos의 막대가 TypeOfBar == "Big"을 갖는 막대만으로 제한하도록하려면 어떻게해야합니까?Mongo C# 드라이버 2.3과 함께 Mongo.Driver.Linq를 사용하여 필터링 된 하위 문서가있는 문서를 반환하려면 어떻게해야합니까?

public class Foo 
{ 
    public string _id { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

public class Bar 
{ 
    public string _id { get; set; } 
    public string TypeOfBar { get; set; } 
} 
내가 쉽게 (특정 유형의 바 모든 FOOS) 첫 번째 부분 얻을 수

: 방법 또한 DB의 수익을 가지고, 내가 힘든 시간을 보내고있어 알아내는 그러나

var client = new MongoClient("myconnectionstring"); 
var db = client.GetDatabase("myDb"); 
var collection = db.GetCollection<Foo>("Foos"); 

var foos = collection.AsQueryable().Where(x => x.Bars.Any(b => b.TypeOfBar == "Big")); 

을 Foos에는 필터링 된 Bars 목록이 있습니다. 당신이 종류가있는 경우에만이 FOOS를 필터링 할 경우

답변

1

"빅은"당신이 ElemMatch 프로젝션을 적용해야합니다

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big")) 
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big")); 

당신이 그것으로해야합니다 문제 : 투사 BSon를 반환합니다. 아마도 그것이 여러분이 필요로하는 것이고 여러분은 그것을 가지고 살 수 있습니다. 그렇지 않다면 Bson을 Foo 클래스에 deserialize합니다. 완전한 쿼리는 다음과 같이 보입니다 :

var res = collection.Find(x => x.Bars.Any(b => b.TypeOfBar == "Big")) 
    .Project(Builders<Foo>.Projection.ElemMatch(x=>x.Bars, b=>b.TypeOfBar == "Big")) 
    .ToEnumerable() 
    .Select(b=>BsonSerializer.Deserialize<Foo>(b)) 
    .ToList(); 
+0

나는 당신이 내가 묻고있는 것을 오해했다고 생각합니다. 예, 두 예제 모두 TypeOfBar == "Big"인 막대가있는 Foos를 반환하지만 반환 된 Foos의 막대를 TypeOfBar == "Big"이있는 막대 만 필터링하지는 않습니다. –

+0

오케이, 대답을 변경했습니다. –

+0

위의 장난감 케이스에서 Foo가 _id 및 Bars 만있는 경우 위의 장난감 케이스에서 작동하지만 Foo에 추가 속성이있는 경우 위 응답이 작동하지 않는 경우 ... 반환 된 Foos는 Bars, 그러나 다른 속성들 중 어느 것도 채워지지 않습니다. Foo의 다른 속성뿐만 아니라 필터링 된 Bars 목록을 사용하여 Foos를 반환하려면 어떻게해야합니까? –

관련 문제