使用IAsyncCursor查询保证排序顺序?

Kic*_*aha 4 c# mongodb mongodb-query

我正在使用一个包含数百万个异步填充记录的集合,因此无法保证订单.

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

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

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

FindAsync方法返回IAsyncCursor.记录以任意批次返回,使用/ 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?;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否会针对整个查询对每个异步"批处理"进行排序?我如何保证记录的顺序正确?

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

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

我需要这样做吗?或升序指数是否足够?

Kic*_*aha 13

可以将一个排序添加到"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++;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @Kickaha 啊..我不是在批评你的回答。我对你的问题和答案都投了票。我的目的只是想了解该计数变量是否有原因。谢谢你的解释。 (2认同)