java - Mongo 对 Java 中两个字段的非重复值计数

标签 java mongodb aggregation-framework

我正在使用 java 连接到 MongoDB。 我想获取和计算两个字段的不同值,即 requestId 和 telNum。我用谷歌搜索但没有找到如何为两个字段获取不同的值。

最佳答案

MongoDB 有一个 Aggregation Framework和管道有点类似于 SQL“GROUP BY”,但阶段可以做更高级的工作。我们将展示一个三阶段示例,以计算出现不止一次的不同组合的数量。

考虑到您指的是文档中 requestId 和 telNum 的相同值的不同出现,并将其视为相应的 SQL

SELECT requestId, telNum, count(*) as counter
from collection
GROUP BY requestId, telNum

mongo shell 位是根据由两个值组合而成的 _id 键分组。因此:

db.collection.aggregate([
    {$group: { _id: { requestId: "$requestId", telNum: "$telNum" }, count: {$sum: 1} } }
])

所以它在 J​​ava 中的要点:

// Construct our _id to group on
DBObject fields = new BasicDBObject( "requestId", "$requestId" );
fields.put( "telNum", "$telNum" );

// Contruct group element
DBObject groupFields = new BasicDBObject( "_id", fields );
groupFields.put( "count", new BasicDBObject( "$sum", 1 ) );
DBObject group = new BasicDBObject( "$group", groupFields );



// Run aggregation
AggregationOutput output = collection.aggregate( group );

所以这里的输出会匹配上面的 SQL。

更进一步,让我们考虑完整的 SQL 来为我们提供不止一次不同的计数:

SELECT count(*) 
FROM ( 
  SELECT requestId, telNum, count(*) as counter
  FROM collection
  GROUP BY requestId, telNum
) a
WHERE a.counter > 1

因此,我们可以修改代码,将更多阶段添加到聚合管道中,再次为 $match (WHERE/HAVING) 和 $group (GROUP BY):

// Construct a match on things with a count of more than 1
DBObject greaterThan = new BasicDBObject( "$gt", 1 );
DBObject matchFields = new BasicDBObject( "count", greaterTen );
DBObject match = new BasicDBObject( "$match", matchFields );

// Count the documents that match
DBObject newGroupFields = new BasicDBObject( "_id", null );
newGroupFields.put( "count", new BasicDBOject( "$sum", 1 ) );
DBObject group2 = new BasicDBObject( "$group", newGroupFields );

// Run aggregation
AggregationOutput output = collection.aggregate( group, match, group2 );

所以这将链中的三个阶段链接起来

  1. 对字段的不同值进行分组
  2. 过滤掉只有 1 个不同值的文档,因此只保留重复项
  3. 从过滤器的结果中计算出不同的对

聚合允许您像这样将各个阶段“链接”在一起以获得结果。它非常适合这类工作,值得注意的是它比使用 Map-Reduce 要快得多。 ,即使它仍然有它的用途。

根据需要编辑和播放。

还有一个有用的例子可以引用here

关于java - Mongo 对 Java 中两个字段的非重复值计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21452674/

相关文章:

java - Java 是否有 "line rule"的编码约定

java - 我可以将字典指定为另一个类实例的属性吗?

node.js - Mongoose 通过引用数组填充和搜索

java - Spring-data-mongo 无法使用构造函数实例化 java.util.List

Mongodb 组然后是子组

java - 如何在java代码中检查平台的验证?

python - Pymongo 多处理

mongodb - 计算数组中相同值出现的次数

javascript - Mongodb 聚合基于过去的日期

java - 快速原始int多键映射?