我使用的是一个异步填充数百万条记录的集合,因此无法保证订单。
查询MongoDB FindAsync方法时,可以添加过滤器,但不能进行排序。
如何确保使用IAsyncCursor返回的记录顺序?我的集合中的纪元日期戳字段有一个升序索引,是否足以保证排序顺序?。
====================
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?;
}
}
}
每个异步&#34;批次&#34;是根据整个查询排序?我如何保证记录的顺序正确?。
epocdatestamp字段上的升序索引将允许我返回完整的排序列表(由于记录数量需要很长时间)。
我应该按照我需要保证的顺序一次将完整的排序列表重写回数据库吗?因此,未来的IAsyncCursor查询将按顺序返回记录。
我需要这样做吗?或升序指数是否足够?
答案 0 :(得分: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++;
}
}
}