用IAsyncCursor查询如何保证排序顺序?

5

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

在查询MongoDB FindAsync方法时,可以添加过滤器,但不能添加排序。

如何确保使用IAsyncCursor返回的记录顺序?我在我的集合中有一个按时间戳字段升序索引,这足以保证排序吗?

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

使用FindAsync方法返回IAsyncCursor。 记录以任意批次返回,可以使用以下 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?;
        }
    }
}

每个异步“批次”会根据整个查询进行排序吗?我如何确保记录按正确顺序排列?
epocdatestamp字段上的升序索引将允许我返回完整排序的列表(由于记录数量很多,需要很长时间)。
我是否应该一次性将完整排序列表按所需顺序重新写回数据库,以便将来的IAsyncCursor查询将按顺序返回记录?
我需要这样做吗?还是升序索引足够了?

在执行查询对象之前,通过指定“sort”修饰符来“保证”它。 - Blakes Seven
@BlakesSeven 感谢您的及时回复... 我发现在使用“Find”时可以添加排序,但在使用FindAsync时不行。您能否创建一个答案,向我展示如何使用上面的代码片段指定排序呢?那会帮助很多。 - Kickaha
2
现在已经很晚了,我得早点睡觉,明天还要叫醒一些少年(十几岁的)。但是,FindAsync的参数FindOptions的文档非常清晰,其中Sort也是一个需要设置的属性。 - Blakes Seven
@BlakesSeven,谢谢你,当我被这些怪物困扰时,你很善良地回应了。希望现在我能学好它 :) - Kickaha
1个回答

17

可以将排序添加到“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++;
            }
        }
    }

1
没问题,你只是忘记将FindOptions参数传递给FindAsync方法。 - BitByte_Bake
@Aravind...这是一个教学时刻,所以我不会抱怨你浪费了我的时间。在示例循环中包含计数语句是一种良性且有些常见的做法。从认知上来说,它通过在上下文中添加功能的具体示例来帮助初学者理解逻辑。我希望你不要挑剔这样一个小小的细节,也许从现在开始在自己的示例中使用一些吧。祝你有美好的一天。 - Kickaha
@JakeStokes 同样的事情,谢谢。祝您有愉快的一天。 - Kickaha
2
@Kickaha 啊..我并不是在批评你的回答。我给了你的问题和答案点赞。我的意图只是想了解那个计数变量是否有原因。感谢你的解释。 - Aravind
@JakeStokes ... 简而言之,请礼貌地表达,不要浪费我的时间。谢谢。 - Kickaha
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接