2017-03-20 43 views
3

我们有一个集合包含服务器中的文档。每个文档都是这样的:使用MongoDB C#驱动程序在查询中包含/排除字段2.4

{ _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驱动程序中非常简单,但我不知道如何在新驱动程序中执行此操作。谢谢。

回答

2

我有一个类似的问题,我相信你需要指定泛型类型,出于某种原因,Project自动假定BsonDocument。这应该将它从BsonDocument修复到您的类中。

变化:

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

要:

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

至于如何只包括某些领域,这可以就像你与制造商这样做(用include)完成或用字符串JSON格式如:

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

我会强烈建议检查出这个家伙是p&投影OST: https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

从这篇文章:

这给我们带来另一个区别:用投影定义,它隐式转换,从学生到BsonDocument文档类型,所以我们回来的是一口流利的对象结果,这将是一个BsonDocument(尽管我们正在使用的是Student类型)。如果我们想与学生一起工作,我们必须表明我们仍然希望将该类型保留给学生。

相关问题