2017-03-20 74 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類型)。如果我們想與學生一起工作,我們必須表明我們仍然希望將該類型保留給學生。

相關問題