繁体   English   中英

如何使用 MongoDB 的 C# 驱动程序指定订单或排序?

[英]How to specify an Order or Sort using the C# driver for MongoDB?

我试图弄清楚如何通过告诉 C# 驱动程序排序顺序是什么来对服务器端的文档集合进行排序,但它似乎还不支持该构造。

是否有可能以其他方式做到这一点?

您还可以使用 MongoCursor 类上的 SetSortOrder 方法来完成此操作:

db["collection"].Find().SetSortOrder(SortBy.Ascending("SortByMe"));

只是为了添加到 Chris 的答案,在 C# Driver 2.x 中,它现在使用SortBySortByDescendingThenByThenByDescending

collection.Find(bson => true).SortBy(bson => bson["SortByMeAscending"]).ThenByDescending(bson => bson["ThenByMeDescending"]).ToListAsync()

现在它更像 Linq。

http://mongodb.github.io/mongo-csharp-driver/2.0/reference/driver/crud/reading/#sort

对于异步方法:

var filter = Builders<BsonDocument>.Filter.Empty;
var sort = Builders<BsonDocument>.Sort.Ascending("time");
collection.FindAsync(filter, new FindOptions<BsonDocument, BsonDocument>()
{
    Sort = sort
});

MongoDB.Driver 2.5.0中api的简单使用

var client = new MongoClient("mongodb://localhost:27017");

var database = client.GetDatabase("Blog");

var list = database.GetCollection<BlogPost>("BlogPost")
    .Find(e => e.Deleted == false)
    .SortByDescending(e => e.CreatedOn)
    .Limit(20)
    .ToList();

请注意,要对多个字段进行排序,请使用以下命令:

db["collection"].Find().SetSortOrder(SortBy.Ascending("SortByMe").Descending("An‌​dByMe");

如果你想使用 linq:

从文档:( http://docs.mongodb.org/ecosystem/tutorial/use-linq-queries-with-csharp-driver/

var query=
    (from c in collection.AsQueryable<C>()
    orderby c.X
    select c)

foreach (var d in query)
{
    // process your documents
}

如果需要,您还可以限制结果:

var query=
    (from c in collection.AsQueryable<C>()
    orderby c.X descending
    select c).Take(1);

请记住在您排序的字段上有一个索引:]

使用现有的 C# 驱动程序执行此操作的方法如下:

db["collection"].Find(new Document().Append("query", 
new Document()).Append("orderby", 
new Document().Append(name:1).Append(age,-1))); 

我在这里被 Sam Corder 打开

@DmitryZyr 对 FindAsync 的回答不起作用。 然而,这一点做到了。

var sortDefinition = new SortDefinitionBuilder<ImmutableLog>().Descending("date");
var findOptions = new FindOptions<ImmutableLog>() {Sort = sortDefinition};
await this.Collection.FindAsync(new BsonDocument(), findOptions);

我目前使用 API 版本 MongoDB.Driver 2.8.1。 这是我调用的方法,用于返回降序排序的对象列表(如果需要):

public static IEnumerable<TEntity> GetDocumentsForCollection(
        IMongoDatabase database,
        string collectionName,
        FilterDefinition<TEntity> query,
        string databaseCollectionKeyToSortOnDescending)
    {
        var _mongoSettings = new MongoCollectionSettings();
        _mongoSettings.GuidRepresentation = GuidRepresentation.Standard;
        var _collection = database.GetCollection<TEntity>(collectionName, _mongoSettings);

        if (string.IsNullOrEmpty(databaseCollectionKeyToSortOnDescending))
        {
            return _collection.Find(query).ToList();
        }

        return _collection.Find<TEntity>(query).Sort(Builders<TEntity>.Sort.Descending(databaseCollectionKeyToSortOnDescending)).ToList();
    }

您可以像这样使用SortDefinition应用排序:

FilterDefinition<User> filter1 = Builders<User>.Filter.Eq(a => a.Deleted , false);
SortDefinition<User> sort = Builders<User>.Sort.Descending(a => a.Id);
List<User> result = _dbContext.Users.Find(filter1).Sort(sort).Limit(10).ToList();

我在 JavaScript 中这样做,因为我不知道 C#,但它应该具有与 C# 驱动程序等效的语法。

如果您的查询如下所示:

db.c.find({"foo" : "bar"})

并且您想按“baz”升序排序,将您的查询包装在“查询”字段中并添加一个“orderby”字段:

db.c.find({"query" : {"foo" : "bar"}, "orderby" : {"baz" : 1}})

对于降序排序,请使用 -1。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM