繁体   English   中英

如何使用 Mongo.Driver.Linq 和 Mongo C# 驱动程序 2.3 返回带有过滤子文档的文档?

[英]How do I return a document with filtered sub-documents using Mongo.Driver.Linq with the Mongo C# driver 2.3?

鉴于以下内容,我如何返回包含 TypeOfBar == "Big" 的 Bars 的所有 Foos并且将 Foos 的 Bars 限制为仅具有 TypeOfBar == "Big" 的那些 Bars?

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; }
}

我可以轻松获得第一部分(所有带有特定类型 Bars 的 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"));

但是,我很难弄清楚如何让数据库返回带有过滤后的 Bars 列表的 Foos。

如果您只想过滤掉类型为“Big”的 Foos,您应该应用ElemMatch Projection:

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM