使用1.10版本的.NET驱动程序,我可以执行类似这样的操作来获取oplog集合中的最大时间戳:
this.oplogCollection.AsQueryable<OplogEntry>().Max(o => o.ts);
我怎么能用新的驱动程序2.0做到这一点?文档基本上不存在或没有帮助,所以我希望一些内部人士可以在这里阐明一些。
编辑:不确定是否有更好的方法,但这是有效的。我还没有找到一种方法来轻松实现$ max运算符。
var list = await collection.Aggregate().SortByDescending((a) => a["field"]).FirstAsync();
你可以试试这个:
var result = await collection.Find(x => true).SortByDescending(d => d.ts).Limit(1).FirstOrDefaultAsync();
BTW $max
没有像Linq或SQL那样给你最大的价值,它指定了Find
的上限。 Documentation here
这是访问到目前为止我发现的oplog中最后一个条目的最快方法:
this.oplogCollection.Find(new BsonDocument()).Sort(new BsonDocument("$natural", -1)).FirstOrDefaultAsync()
它以反向自然顺序对oplog进行排序,并且由于oplog中的自然顺序是通过升序时间戳,因此抓取最后一个元素会给出最大值。
这种方法非常快,从第一次实验开始,它似乎不依赖于oplog大小,因为没有实际的排序。
其他解决方案的性能会随着oplog的大小而降低。
从MongoDB.Driver 2.0开始,最好的方法是使用FindOptions
实例和指定的Limit
和Sort
字段:
var options = new FindOptions<OplogEntry, OplogEntry>
{
Limit = 1,
Sort = Builders<OplogEntry>.Sort.Descending(o => o.ts)
};
var max = (await oplogCollection.FindAsync(FilterDefinition<OplogEntry>.Empty, options)).FirstOrDefault();
Sort
和Limit
params在服务器端处理。因此,只有一个结果项传递给客户端,这种操作非常有效。