以内存高效的方式计算MongoDB(Java驱动程序)中的唯一对象

以内存高效的方式计算MongoDB(Java驱动程序)中的唯一对象,java,mongodb,Java,Mongodb,我试图计算集合中唯一对象的数量。我的方法包括获取唯一对象的列表并调用.size()。。。当存在大量对象时,这会导致内存问题。你知道更好的方法吗 以下是我正在做的: // note DBConfig.getMongoUrl() returns a String with the URL public static int countUniqueProductsByKeyAndCode(String cKey, String cCode){ List<Product> prod

我试图计算集合中唯一对象的数量。我的方法包括获取唯一对象的列表并调用.size()。。。当存在大量对象时,这会导致内存问题。你知道更好的方法吗

以下是我正在做的:

// note DBConfig.getMongoUrl() returns a String with the URL

public static int countUniqueProductsByKeyAndCode(String cKey, String cCode){
    List<Product> prods = new ArrayList<>();
    try {
        MongoURI mongoURI = new MongoURI(DBConfig.getMongoUrl());
        DBCollection collection = mongoURI.connectDB().getCollection("Product");
        DBObject query = new BasicDBObject("cKey", cKey);
        query.put("cCode", cCode);
        prods = collection.distinct("name", query);
    } catch(Exception e){
      p.rint(e);
    }
    return prods.size();
}
//注意DBConfig.getMongoUrl()返回一个带有URL的字符串
公共静态int countUniqueProductsByKeyAndCode(字符串cKey,字符串cCode){
List prods=new ArrayList();
试一试{
MongoURI MongoURI=新的MongoURI(DBConfig.getMongoUrl());
DBCollection collection=mongoURI.connectDB().getCollection(“产品”);
DBObject query=newBasicDBObject(“cKey”,cKey);
查询.放置(“cCode”,cCode);
prods=collection.distinct(“名称”,查询);
}捕获(例外e){
p、 rint(e);
}
返回prods.size();
}

您可以在3.4服务器上使用以下聚合

public static int countUniqueProductsByKeyAndCode(String cKey, String cCode){
  int size = 0;
  try {
    MongoURI mongoURI = new MongoURI(DBConfig.getMongoUrl());
    DBCollection collection = mongoURI.connectDB().getCollection("Product");
    DBObject query = new BasicDBObject("cKey", cKey);
    query.put("cCode", cCode);
    DBObject match = new BasicDBObject("$match", query);
    DBObject id = new BasicDBObject("_id", "$name");
    DBObject group = new BasicDBObject("$group", id);
    DBObject count = new BasicDBObject("$count", "count");
    AggregationOutput output = collection.aggregate(Arrays.asList(match, group, count));
    size = (int) output.results().iterator().next().get("count");
   } catch(Exception e){
       p.rint(e);
   }
   return size;
}
对于低于3.4的版本,将计数替换为以下组

 DBObject countd = new BasicDBObject("_id", null).append("count", new BasicDBObject("$sum", 1));
 DBObject count = new BasicDBObject("$group", countd);

谢谢,看来我得升级我的MongoDBNp了。我添加了旧版本的版本投诉。更新mongodb服务器时也要更新mongodb java驱动程序。您好,当我在本地测试时,代码挂起,我已将DB和库升级到3.4-旧代码确实有效,因此升级似乎成功。现在尝试旧版本的代码(可能升级出了问题)将尝试几种不同的方法-当推送到服务器时,可能会起作用。