【问题标题】:FindIterable<Document> how to get total records in a result of a queryFindIterable<Document> 如何在查询结果中获取总记录
【发布时间】:2015-11-17 15:33:50
【问题描述】:

我在 java 2.x 中使用 mongo 驱动程序并传递到 3.1。 DBCursor 已弃用,我不得不使用 FindIterable&lt;Document&gt; 结构。

当我执行查询时

FindIterable<Document> cursor=(mongo).getCollection().find(findArgs).limit(10).skip(0);

我想通过查询仅在一个查询中找到结果集中的记录总数。

如何在不执行其他查询的情况下检索计数? 我说的不是限制中的 10 条记录,而是记录的总数。

我想执行一个查询来检索计数和查找。我不想执行查找和计数。

谢谢

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    有可用的计数方法。 它接受 Bson 过滤器。所以拿到集合对象后,就可以直接放count函数了。 MongoCollection 集合 = db.getCollection(collectionName); long totalFilteredRecords = collection.count("field","value");

    【讨论】:

      【解决方案2】:

      你可以用这个:

      (mongo).getCollection().count(findArgs);
      

      【讨论】:

      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
      【解决方案3】:

      FindIterable 基本上是一个迭代器。迭代器不知道它们将返回的元素的总大小。我发现最好的方法是创建一个“查询映射”,但有两个查询操作(一个查找和一个计数)。

      类似这样的东西(时髦):

      Map query = [_id: [$in:idList]]
      
      FindIterable userList = User.collection.find(query).skip(offset).limit(max)
      
      Integer totalCount = User.collection.count(query)
      

      我知道这不是你想要的,但我相信你想要的不可能。

      另一种方法是使用聚合(mongodb 版本 3.4+),但不确定这是否对您更好。 Here

      【讨论】:

        【解决方案4】:

        虽然这个问题很老,而且您可能已经找到了答案,但我会将其发布给像我这样正在苦苦挣扎的新手。 无需任何查询,您可以直接使用“计数”

        mongoClient = new MongoClient("localhost", 27017);
                      DB db = mongoClient.getDB("DatabaseName");
                      DBCollection coll = db.getCollection("CollectionName");
                      long count = coll.count();
        

        希望对您有所帮助!

        【讨论】:

          【解决方案5】:

          MongoCollection.count() 在较新版本中已弃用。您可以使用:

          long result = collection.countDocuments(findArgs);
          

          例如

          long result = collection.countDocuments(eq("_id", idValue));
          

          【讨论】:

            【解决方案6】:

            这是一个老问题。一个典型的答案是使用 count() 方法。但是,考虑到性能,它并不总是首选方法。

            要执行 count() 方法,MongoDB 服务器必须遍历所有匹配过滤器的文档。如果总匹配的文档数量很大,并且中标方案不是最优方案,将会非常慢并且使用大量负载。

            一个常见的策略,就是预测结果来帮助 MongoDB 优化获胜计划。因此,获胜的计划很可能是最优的。它会比纯 count() 更快。

            然后,使用 Iterable size 方法(例如来自 guava 的方法),代码如下:

            Iterable<?> it = table.find(filterBson).projection(new Document("_id", 1));
            int count = Iterables.size(it);
            

            【讨论】:

              【解决方案7】:

              int size = Iterators.size(cursor.iterator());

              他们想要对记录进行计数。 cursor.iterator() 为您提供一个迭代器对象。 Iterators.size() 获取迭代器中的记录数。

              【讨论】:

              • 他们想要对记录进行计数。 cursor.iterator() 为您提供一个迭代器对象。 Iterators.size() 获取迭代器中的记录数。
              猜你喜欢
              • 2019-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-01-29
              • 1970-01-01
              • 2011-04-11
              相关资源
              最近更新 更多