我们在服务器中有一个包含文档的集合。每个文档如下:
{ _id: "...", Prop1: "", Prop2: "", Prop3: "", LargeField: "", ... }
还有许多其他字段,但客户端不需要这些字段。
我要将文档加载为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(尽管我们正在使用的是学生类型)。如果要使用"学生",则必须表明仍要将类型保留为"学生"。