使用IAsyncCursor查询保证排序顺序

本文关键字:排序 顺序 IAsyncCursor 查询 使用 | 更新日期: 2023-09-27 18:07:04

我正在使用一个包含数百万条异步填充记录的集合,因此不能保证顺序。

查询MongoDB时,FindAsync方法将允许添加过滤器,但不允许排序。

我如何确保使用IAsyncCursor返回的记录顺序?我在集合中的epoch日期戳字段上有一个升序索引,这是否足以保证排序顺序?

====================

IAsyncCursor由FindAsync方法返回。记录以任意批方式返回,这些记录使用下面的using/while构造进行处理。

var collection = _database.GetCollection<BsonDocument>("restaurants");
var filter = new BsonDocument();
var count = 0;
using (var cursor = await collection.FindAsync(filter))
{
    while (await cursor.MoveNextAsync())
    {
        var batch = cursor.Current;
        foreach (var document in batch)
        {
            // What order will these records be in? how do I guarantee order ascending by epochtimestamp?;
        }
    }
}

将每个异步"批处理"排序相对于查询的整体?我如何保证记录的顺序正确?

在epodatstamp字段上的升序索引将允许我返回一个完整的排序列表(由于记录的数量,需要很长时间)。

我应该一次重写完整的排序列表回到DB在我需要保证的顺序?因此未来的IAsyncCursor查询将按顺序返回记录。

我需要这样做吗?或者升序索引就足够了吗?

使用IAsyncCursor查询保证排序顺序

可以将排序添加到"FindOptions"对象并将其作为参数提供给FindAsync。在本例中,对字段epochtimestamp进行升序排序。

当你知道如何简单,

    var collection = _database.GetCollection<BsonDocument>("restaurants");
    var filter = new BsonDocument();
    var sort = Builders<BsonDocument>.Sort.Ascending("epochdatestamp");
    var options = new FindOptions<BsonDocument>
                  {
                    Sort = sort
                  };
    var count = 0;
    using (var cursor = await collection.FindAsync(filter, options))
    {
        while (await cursor.MoveNextAsync())
        {
            var batch = cursor.Current;
            foreach (var document in batch)
            {
                // process document
                count++;
            }
        }
    }