![](/img/trans.png)
[英]How to find items in a collection that nested array field contains specific string using mongodb .net driver C#?
[英]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开始,最好的方法是使用带有指定Limit
和Sort
字段的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();
Sort
和Limit
参数在服务器端处理。 因此,只有一个结果项传递给客户端,这种操作非常有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.