簡體   English   中英

如何在Mongo驅動程序中為“orderby”編寫查詢以進行排序?

[英]How to write a query for “orderby” in Mongo driver for C# to sort?

我正在嘗試使用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在這里問了一個類似的問題。 但是接受的答案對我不起作用。

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

也是解決這個問題的正確方法

看起來接受的答案已經過時或者我不明白。 這是您在MongoDb C#Driver 2.0中訂購的方式:

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

您可以將MongoDB.Driver.Builders.Query.Null用作Find()的IMongoQuery參數,而不是使用SetSortOrder().SetLimit()

你的代碼就像

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

您應該使用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)

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

沒有理由不能將SetSortOrder和SetLimit與FindAll一起使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM