2017-01-12 43 views
2

鑑於以下情況,我如何返回所有包含帶有TypeOfBar ==「Big」的Bars的Foos?是否將Foos的Bars限制爲只有TypeOfBar ==「Big」的那些Bars?如何使用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與特定類型的酒吧):

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。

回答

1

如果你想過濾出此FOOS有型「大」,你應該申請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類。完整的查詢,我看起來像:

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」的Bars的Foos,但是,他們不會*將*返回的Foos的Bars過濾爲只有那些帶有TypeOfBar ==「Big」的Bars。 –

+0

好的,我改變了答案。 –

+0

所以這個工程在上面的玩具箱裏,Foo只有一個_id和一個酒吧列表,但是如果Foo有一些額外的屬性,那麼上面的答案不起作用......返回的Foos只有一個酒吧列表,但他們的其他財產都沒有填寫。 我該如何返回Foos以及酒吧的過濾列表以及Foo的其他屬性? –

相關問題