是否可以计算 MongoTemplate 中的不同文档?

Is it possible to count distinct Documents in MongoTemplate?

是否可以在 mongoTemplate 中以某种方式链接 distinct(...) 和 countDocuments(...)。

像这样

mongoTemplate.getCollection("foo").distinct("bar", Foo.class).countDocuments();

请记住,我将有几百万个结果,所以我不想通过将所有不同的实体放入一个数组然后获取它的大小来在 jvm 中造成瓶颈。我宁愿从 MongoDB 得到一个数字,也不想打扰 JVM。

我记得上次我使用 Aggregation Pipeline Operators 对集合进行分组(这将为您提供不同的值),然后在其上使用 count()

例如:

Aggregation pipeline = newAggregation(
        group(fields("foo","bar")),
        group("_id.bar").count().as("distinctCount")
    ); 

否则使用以下一种衬里:

return mongoTemplate.aggregate(aggregation,Class.COLLECTION_NAME,BasicDBObject.class).getMappedResult();
// in this case make sure this function's return type is Integer or Long not int or long

注意:在这种情况下,确保函数的 return 类型是 IntegerLong 而不是 intlong,因为 int 和 long 是原始数据类型,它们不包含 null。但是,如果没有数据,聚合逻辑可能 return null 因此使用 Long 或 Integer(对象可能为 null)

是的,可以使用 mongoTemplate 获取不同文档的数量。

Mongoshell查询

db.foo.aggregate([{
    $group: {
        _id: "$bar"
    }
}, {
    $count: "total"
}]);

此查询的输出将是

{
    "total" : 8
}

使用Mongo模板获得此结果:

GroupOperation groupOperation = Aggregation.group("bar");
CountOperation countOperation = Aggregation.count().as("total");
Aggregation aggregation = Aggregation.newAggregation(groupOperation, countOperation);

Document result = mongoTemplate.aggregate(aggregation, "foo", Document.class)
        .getUniqueMappedResult();
Integer total = Objects.nonNull(result) ? result.getInteger("total") : 0;

您可以使用 Mongo 与 $group 聚合。

db.foo.aggregate([{
  '$group': {
    '_id': '_id', 
    'count': {
    '$sum': 1
   }
  }]);

您将获得:

{ "_id":"_id", "count":12}