使用MongoDB C#驱动程序2.4在查询中包括/排除字段字段、驱动程序、MongoDB

2023-09-03 14:12:16 作者:来不及猜想

我们在服务器中有一个包含文档的集合。每个文档如下:

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

还有许多其他字段,但客户端不需要这些字段。

MongoDB数据查询中的关键字

我要将文档加载为MyDoc类,其定义为:

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

我已尝试:

var client = new MongoClient(uri);
var database = client.GetDatabase("MyDatabase");
var collection = database.GetCollection<MyDocs>("MyDocs");
var allDocs = collection.Find().ToList();
然后它将加载每个文档的所有字段,因此我必须将[BsonIgnoreExtraElements]放在MyDoc上。这里的问题是文档很大,但我只需要一个有限的字段子集。是否可以让驱动程序知道我只需要类中定义的字段?

如果不是,是否可以排除一些像LargeField这样的字段以使结果集更小?我已尝试:

var fieldsBuilder = Builders<MyDoc>.Projection;
var fields = fieldsBuilder.Exclude(d => d.LargeField);
var allDocs = collection.Find().Project(fields).ToList();
但现在allDocs变为BsonDocument列表,而不是MyDoc列表。如何使用投影查询MyDoc

有人能帮忙吗?在传统的MongoDB驱动程序中,这很简单,但我不知道在新的驱动程序中如何做到这一点。谢谢。

推荐答案

我遇到过类似的问题,我认为您需要指定泛型类型,出于某种原因,项目会自动假定BsonDocument。这应该会将它从BsonDocument修复到您的类。

更改:

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

收件人:

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

至于如何只包含某些字段,这可以像使用Builder(使用Include)或使用json形式的字符串一样完成:

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

我强烈建议查看这个人的帖子上的预测: https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

摘自本文:

这给我们带来了另一个不同之处:使用投影定义,它隐式地将文档类型从学生转换为BsonDocument,因此我们得到的是一个流畅的对象,结果将是一个BsonDocument(尽管我们正在使用的是学生类型)。如果要使用"学生",则必须表明仍要将类型保留为"学生"。