2012-02-17 109 views
8

我想从MongoDB的“Deal”集合中使用MongoDB的C#驱动程序检索五个最近的文档。我可以用下面的代码来完成。如何在Mongo驱动程序中为C#排序查询“orderby”?

public IList<TEntity> GetRecentFive() 
{ 
    IList<TEntity> entities = new List<TEntity>(); 
    using (MongoDbContext dbContext = new MongoDbContext(_dbFactory)) 
    { 
     var cursor = dbContext.Set<TEntity>().FindAll().SetSortOrder(SortBy.Descending("ModifiedDateTime")).SetLimit(5); 

     foreach (TEntity entity in cursor) 
     { 
      entities.Add(entity); 
     } 
    } 

    return entities; 
} 

但我只想得到最近的5个文档,FindAll()加载集合中的所有文档。我试图用Find()来做,但它需要查询作为参数。如何在Mongo驱动程序中为“#orderby”编写查询以便C#排序?

https://stackoverflow.com/a/2148479/778101在这里问了一个类似的问题。但接受的答案不适合我。

回答

10
using (MongoDbContext dbContext = new MongoDbContext(_dbFactory)) 
{ 
    var query = new QueryDocument(); 

    var cursor = 
     dbContext.Set<TEntity>().Find(query).SetSortOrder(SortBy.Descending("ModifiedDateTime")).SetLimit(5); 

    foreach (TEntity entity in cursor) 
    { 
     entities.Add(entity); 
    } 
} 

也是解决这个问题的正确方法

0

您应该使用Find方法。在c#中的Query.And()将等于在mongodb外壳上的空查询{}。因此,完整的例子会看起来像:

dbContext.Set<TEntity>() 
     .Find(Query.And()) 
     .SetSortOrder(SortBy.Descending("ModifiedDateTime")) 
     .SetLimit(5); 

其实,如果你收集强键入它有方法Find(IMongoQuery query),如果没有,那么它有方法FindAs<Type>(IMongoQuery query)

1

您可以使用MongoDB.Driver.Builders.Query.Null为查找(IMongoQuery参数),比做SetSortOrder().SetLimit()

您的代码可以像

 
dbContext.Set() 
     .Find(Query.Null).SetSortOrder(SortBy.Descending("ModifiedDateTime")) 
     .SetLimit(5); 
0

FindAll只是查找(Query.Null)的快捷方式。

没有理由不能使用SetSortOrder和SetLimit和FindAll。

2

看起来接受的答案已过时,或者我不理解它。这是你如何在MongoDb C#驱动2.0中订购:

var list = await collection 
        .Find(fooFilter) 
        .Sort(Builders<BsonDocument>.Sort.Descending("NameOfFieldToSortBy") 
        .ToListAsync();