我有一个MongoDB集合,我需要在运行过滤器后找到不同的记录数。 这就是我现在所拥有的,
var filter = Builders<Foo>.Filter.Eq("bar", "1");
db.GetCollection<Foo>("FooTable").Distinct<dynamic>("zoo", filter).ToList().Count;
我不喜欢这种解决方案,因为它会读取内存中的集合以获取计数。
是否有更好的方法直接从db获取不重复计数?
答案 0 :(得分:1)
以下代码将使用聚合框架完成工作。
var x = db.GetCollection<Foo>("FooTable")
.Aggregate()
.Match(foo => foo.bar == 1)
.Group(foo => foo.zoo,
grouping => new { DoesNotMatter = grouping.Key })
.Count()
.First()
.Count;
时髦的“ DoesNotMatter”位似乎是必需的(可以使用其他名称),但是驱动程序将不接受null
或其他任何内容……请注意,无论如何它都会被优化,因此不会发送给MongoDB。
此外,此代码将完全在服务器上执行。但是,它不会使用索引,因此可能会比此时的索引慢。
您当前的代码可以简化为:
db.GetCollection<Foo>("FooTable").Distinct(d => d.zoo, d => d.bar == 1).ToList().Count;
这将使用索引(如果可用),但是,是的,它将所有不同值的列表传送回客户端...