使用MongoDB C#驱动程序查询构建器获取项目计数

时间:2012-02-16 16:18:10

标签: mongodb mongodb-.net-driver

使用MongoDB的c#驱动程序我可以轻松地构建一个查询,然后我可以添加SetSkip()和SetLimit()参数来将结果集限制到一定的大小。

但是我希望能够在应用Skip和Take 之前知道查询的项目数,而不执行执行查询并将整个结果集(可能很大)加载到存储器中。

看起来我可以通过使用count()命令直接通过shell对MongoDB执行此操作。 e.g:

 db.item.find( { "FieldToMatch" : "ValueToMatch" } ).count()

只返回一个整数,这正是我想要的。但我在文档中看不到通过C#驱动程序执行此操作的方法。有可能吗?

(应该注意的是,我们已经广泛使用了查询构建器,所以理想情况下我宁愿通过查询构建器执行此操作,而不是通过驱动程序向shell发出命令,如果可能的话。但是如果可行的话。这是唯一的解决方案然后一个例子会有所帮助,谢谢。)

干杯, 马特

2 个答案:

答案 0 :(得分:15)

你可以这样做:

var server = MongoServer.Create("mongodb://localhost:27020");
var database = server.GetDatabase("someDb");

var collection = database.GetCollection<Type>("item");
var cursor = collection.Find(Query.EQ("FieldToMatch" : "ValueToMatch"));

var count = cursor.Count(); 

一些注意事项:

  1. 您应该只有一个服务器实例(单例)
  2. 最新的驱动程序版本实际上返回长计数而不是int
  3. 光标仅在迭代后提取数据
  4. 您可以在实际加载数据之前配置很多内容,例如skip,take,指定要在游标中返回的字段(开始迭代)
  5. 游标的Count()方法仅加载文档计数

答案 1 :(得分:1)

我正在使用Driver 2.3.0,现在也可以这样做:

...
IMongoCollection<entity> Collection = db.GetCollection<entity>(CollectionName);
var yourFilter = Builders<entity>.Filter.Where(o => o.prop == value);
long countResut = Collection.Count(yourFilter);