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

问题描述 投票:4回答:4

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

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

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

c# .net mongodb mongodb-.net-driver
4个回答
3
投票

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

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

3
投票

你可以试试这个:

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

BTW $max没有像Linq或SQL那样给你最大的价值,它指定了Find的上限。 Documentation here


2
投票

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

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

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

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

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


1
投票

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

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 params在服务器端处理。因此,只有一个结果项传递给客户端,这种操作非常有效。

© www.soinside.com 2019 - 2024. All rights reserved.