如何在Mongo驱动程序中为“orderby”编写查询以进行排序?

时间:2012-02-17 09:00:22

标签: c# mongodb mongodb-.net-driver

我正在尝试使用MongoDB的C#驱动程序从MongoDB中的“Deal”集合中检索五个最近的文档。我可以使用下面的代码来完成。

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驱动程序中为C#编写“orderby”查询以进行排序?

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

5 个答案:

答案 0 :(得分:11)

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);
    }
}

也是解决此问题的正确方法

答案 1 :(得分:3)

看起来接受的答案已过时或我不理解。这是您在MongoDb C#Driver 2.0中订购的方式:

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

答案 2 :(得分:1)

您可以将MongoDB.Driver.Builders.Query.Null用作Find()的IMongoQuery参数,而不是SetSortOrder().SetLimit()

您的代码可以像

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

答案 3 :(得分:0)

您应该使用Find方法。 c#中的Query.And()将等同于mongodb shell中的空查询{}。完整的例子如下:

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

实际上,如果你收集强类型,它有方法Find(IMongoQuery query),如果没有,那么它有方法FindAs<Type>(IMongoQuery query)

答案 4 :(得分:0)

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

没有理由不能将SetSortOrder和SetLimit与FindAll一起使用。