2011-12-09 59 views

回答

39

更新:有了新的驅動程序版本(1.6以上版本),就可以避免字段名的硬編碼和使用LINQ來代替:

var users = usersCollection.FindAllAs<T>() 
          .SetFields(Fields<T>.Include(e => e.Id, e => e.Name)); 

您可以通過MongoDB的光標SetFields方法做到這一點:

var users = usersCollection.FindAllAs<T>() 
       .SetFields("_id") // include only _id 
       .ToList(); 

通過defaul SetFileds包括指定的字段。如果您需要排除某些字段,你可以使用:

var users = usersCollection.FindAllAs<T>() 
       .SetFields(Fields.Exclude("_id")) // exclude _id field 
       .ToList(); 

或者你也可以一起使用它們:

var users = usersCollection.FindAllAs<T>() 
       .SetFields(Fields.Exclude("_id") // exclude _id field 
            .Include("name")) // include name field 
       .ToList(); 
27

由驅動器2.0開始有一個新的只異步API。不應該再使用舊的API,因爲它是新API的屏蔽外觀,因此不推薦使用。

目前推薦的包含或排除某些成員的方法是使用Project方法從Find獲得IFindFluent

您可以通過lambda表達式:

var result = await collection.Find(query).Project(hamster => hamster.Id).ToListAsync(); 

或者使用投影建設者:

var result = await collection.Find(query) 
    .Project<Hamster>(Builders<Hamster>.Projection.Include(hamster => hamster.Id)) 
    .ToListAsync(); 

var result = await collection.Find(query) 
    .Project<Hamster>(Builders<Hamster>.Projection.Exclude(hamster => hamster.FirstName). 
     Exclude(hamster => hamster.LastName)) 
    .ToListAsync(); 
+0

但是Project方法只對內存中的結果進行過濾。整個文檔正在從服務器獲取,如果文檔很大,這是不好的。在c#驅動程序中必須有一些其他API調用,使得查詢只提取特定的字段。 –

+5

@YaronLevi不,**項目**不**只在內存中過濾。 **它是隻提取特定字段的API。 – i3arnon

+0

這個方法是否需要該類進行註冊(即'BsonClassMap.RegisterClassMap ...')? – MoonKnight

1

更新你可以使用一個投影和FindAsync which returns a cursor and doesn't load all documents at once unlike Find。您還可以設置排序順序並限制返回的文檔數量。

var findOptions = new FindOptions<BsonDocument>(); 

    findOptions.Projection = "{'_id': 1}"; 

    // Other options 
    findOptions.Sort = Builders<BsonDocument>.Sort.Ascending("name");   
    findOptions.Limit = int.MaxValue; 

    var collection = context.MongoDatabase.GetCollection<BsonDocument>("yourcollection"); 

    using (var cursor = collection.FindSync("{name : 'Bob'}", options)) 
    { 
     while (cursor.MoveNext()) 
     { 
      var batch = cursor.Current; 
      foreach (BsonDocument document in batch) 
      { 
       // do stuff... 
      } 
     } 
    } 
相關問題