繁体   English   中英

使用.Net Driver 2在MongoDB集合中查找max

[英]Find max in a MongoDB collection using .Net Driver 2

使用1.10版本的.NET驱动程序,我可以执行类似这样的操作来获取oplog集合中的最大时间戳:

this.oplogCollection.AsQueryable<OplogEntry>().Max(o => o.ts);

我怎么能用新的驱动程序2.0做到这一点? 文档基本上不存在或没有帮助,所以我希望一些内部人士可以在这里阐明一些。

你可以试试这个:

var result = await collection.Find(x => true).SortByDescending(d => d.ts).Limit(1).FirstOrDefaultAsync();

BTW $max不会像Linq或SQL那样为您提供$max ,它指定了Find的上限。 文档在这里

编辑:不确定是否有更好的方法,但这是有效的。 我还没有找到一种方法来轻松实现$ max运算符。

var list = await collection.Aggregate().SortByDescending((a) => a["field"]).FirstAsync();

这是访问到目前为止我发现的oplog中最后一个条目的最快方法:

this.oplogCollection.Find(new BsonDocument()).Sort(new BsonDocument("$natural", -1)).FirstOrDefaultAsync()

它以反向自然顺序对oplog进行排序,并且由于oplog中的自然顺序是通过升序时间戳,因此抓取最后一个元素会给出最大值。

这种方法非常快,从第一次实验开始,它似乎不依赖于oplog大小,因为没有实际的排序。

其他解决方案的性能会随着oplog的大小而降低。

从MongoDB.Driver 2.0开始,最好的方法是使用带有指定LimitSort字段的FindOptions实例:

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();

SortLimit参数在服务器端处理。 因此,只有一个结果项传递给客户端,这种操作非常有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM