【问题标题】:Getting an item count with MongoDB C# driver query builder使用 MongoDB C# 驱动程序查询生成器获取项目计数
【发布时间】:2012-03-08 01:32:06
【问题描述】:

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

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

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

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

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

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

干杯, 马特

【问题讨论】:

    标签: mongodb mongodb-.net-driver


    【解决方案1】:

    你可以这样做:

    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. 最新的驱动版本实际上返回 long count 而不是 int
    3. 光标仅在您迭代后获取数据
    4. 在实际加载数据(开始迭代)之前,您可以配置很多东西,例如跳过、获取、指定要在光标中返回的字段(开始迭代)
    5. Count() 游标方法只加载文档计数

    【讨论】:

    • 啊,好吧。因此,在您真正开始迭代项目之前,数据不会加载到内存中?换句话说,我可以在不获取所有文档的情况下对光标调用 .Count() 吗?
    • 酷 - 这是我需要的关键信息,谢谢。知道这是否在任何地方的文档中都有说明会很有用,但与此同时,打勾:)
    • @MattThrower:我不知道,我并没有真正阅读很多文档。阅读源代码对我来说更简单:)
    • 我个人更喜欢 collection.Count(Query.EQ("FieldToMatch", "ValueToMatch"));而不是 Find()。
    【解决方案2】:

    我正在使用驱动程序 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);
    

    【讨论】:

      猜你喜欢
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2015-09-08
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多