使用C#在MongoDB中查找非重复计数(mongocsharpdriver)

时间:2018-08-07 20:45:50

标签: c# mongodb mongodb-csharp-2.0

我有一个MongoDB集合,我需要在运行过滤器后找到不同的记录数。 这就是我现在所拥有的,

var filter = Builders<Foo>.Filter.Eq("bar", "1");
db.GetCollection<Foo>("FooTable").Distinct<dynamic>("zoo", filter).ToList().Count;

我不喜欢这种解决方案,因为它会读取内存中的集合以获取计数。

是否有更好的方法直接从db获取不重复计数?

1 个答案:

答案 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;

这将使用索引(如果可用),但是,是的,它将所有不同值的列表传送回客户端...