我正在寻找获得相当大(> 100万个文档)MongoDB集合的最后元素的最有效方法。
具体来说,它是oplog集合,我在给定时间戳之后查找所有条目。搜索大约一百万个条目的时间戳大于当前时间戳是没有意义的,因为它们都是旧的,因为集合以其自然顺序存储。
有没有办法告诉MongoDB从集合的末尾进行搜索? 我尝试使用Skip(N)进行linq查询,但速度非常慢。它似乎从一开始就解析所有文档,并且不会返回第一个N.
答案 0 :(得分:1)
最有效的方法可能是使用aggregation。如果您的集合已排序,则可以使用此聚合获取最后一个时间戳:
var group = new BsonDocument
{
{
"$group", new BsonDocument
{
{"_id", 0},
{"newestTimeStamp", new BsonDocument { {"$last","$timeStamp"} } }
}
}
};
var pipeline = new[] {group};
var result = _dtCollection.Aggregate(pipeline);
}
然后,您可以将结果反序列化为Timestamp类。如果要获取多个元素,可以使用$ match创建类似的表达式。
还要确保在TimeStamp字段上为集合添加索引。如果您决定使用它,这可能会使您的LINQ查询更快。