【问题标题】:Guaranteeing sort order with an IAsyncCursor query?使用 IAsyncCursor 查询保证排序顺序?
【发布时间】:2015-10-31 00:22:04
【问题描述】:

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

查询 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 查询将按顺序返回记录。

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

【问题讨论】:

  • 您在执行前通过为查询对象指定“排序”修饰符来“保证”它。
  • @BlakesSeven 感谢您的及时回复...我发现使用“查找”时可以添加排序,但使用 FindAsync 时不能。你会创建一个答案,告诉我使用上面的代码 sn-p 指定排序的位置吗?这会很有帮助。
  • 真的是(很早之前)就寝时间了,早上我还有很多海胆(以及十几岁的孩子)要醒来。但是对于FindOptions 作为FindAsync 的参数,文档非常清楚,其中Sort 也是set 的属性。
  • @BlakesSeven,谢谢你,当你被这些怪物围攻时,你很乐意回应。希望我现在能学好 :)

标签: c# mongodb mongodb-query


【解决方案1】:

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

【讨论】:

  • 没关系,您只是忘记将 FindOptions 参数传递给 FindAsync 方法。
  • @Kickaha 为什么是 foreach 循环中的 count++ 语句。我没听懂。
  • @Aravind 我同意;它旨在对文档进行计数,对于示例而言是多余的。
  • @Aravind ...这是一个教学时刻,所以我不抱怨你在浪费我的时间。在示例循环中包含计数语句是一种良性且有些普遍的做法。在认知上,它通过在上下文中添加具体的功能示例来帮助初学者理解逻辑。如果您不挑剔像这样的含糖细节,我将不胜感激,也许从现在开始在您自己的示例中使用一些。祝你有美好的一天。
  • @Kickaha Ahh .. 我不是在批评你的回答。我对你的问题和答案都投了赞成票。我的意图只是了解该计数变量是否有原因。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2019-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 2021-10-11
  • 2016-12-09
  • 1970-01-01
相关资源
最近更新 更多