【发布时间】: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