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

发布于 2025-01-07 01:53:55 字数 837 浏览 0 评论 0原文

我正在尝试使用 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 驱动程序中编写“orderby”查询以便 C# 进行排序?

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

I am trying to retrieve five recent documents from "Deal" collection in a MongoDB using C# driver for MongoDB. I can do it with the below code.

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

But I want to get only the recent 5 documents and FindAll() loads all the documents in the collection. I tried to do it with Find() but it needs a query as a parameter. How can I write a query for "orderby" in Mongo driver for C# to sort?

https://stackoverflow.com/a/2148479/778101 asked a similar question here. But the accepted answer doesn't work for me.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

心病无药医 2025-01-14 01:53:55
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);
    }
}

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

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

is also a correct method to solve this problem

羁拥 2025-01-14 01:53:55

看起来接受的答案已经过时或者我不明白。这是在 MongoDb C# Driver 2.0 中排序的方式:

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

Looks like the accepted answer is out of date or I don't understand it. This is how you order by in MongoDb C# Driver 2.0:

var list = await collection
                     .Find(fooFilter)
                     .Sort(Builders<BsonDocument>.Sort.Descending("NameOfFieldToSortBy")
                     .ToListAsync();
岁月静好 2025-01-14 01:53:55

您可以使用 MongoDB.Driver.Builders.Query.Null 作为 Find() 的 IMongoQuery 参数,然后执行 SetSortOrder().SetLimit()

您的代码可以是这样

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

You can use MongoDB.Driver.Builders.Query.Null as IMongoQuery parameter for Find() and than do the SetSortOrder().SetLimit()

Your code can be like

dbContext.Set()
         .Find(Query.Null).SetSortOrder(SortBy.Descending("ModifiedDateTime"))
         .SetLimit(5);
抚笙 2025-01-14 01:53:55

您应该使用查找方法。 C# 中的 Query.And() 相当于 mongodb shell 中的空查询 {}。完整的示例如下所示:

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

实际上,如果您收集强类型,它具有方法 Find(IMongoQuery query),如果没有,则它具有方法 FindAs(IMongoQuery query)

You should use Find method. Query.And() in c# will be equivalent to empty query {} at mongodb shell. So full example will looks like:

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

Actually if you collection strong typed it have method Find(IMongoQuery query), if not then it have method FindAs<Type>(IMongoQuery query).

流云如水 2025-01-14 01:53:55

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

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

FindAll is just a shortcut for Find(Query.Null).

There is no reason you can't use SetSortOrder and SetLimit with FindAll.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文