在mongodb中计算具有多个出现的字段值

时间:2016-01-11 08:17:51

标签: java mongodb mongodb-query

我有一个像

这样的集合
_id: ObjectId("568f93b5e0ce9f35377c723e")
 rollNo: "123"

 _id: ObjectId("568f93b5e0ce9f35377c723g")
 rollNo: "111"

 _id: ObjectId("568f93b5e0ce9f35377c723g")
 rollNo: "123"

我想查询并获取不同卷数的计数。例如,从我上面的集合中,我应该将计数作为2.并且我还想打印出的卷数不止一个,例如来自我上面的收集卷,不应该打印123.

我试过

db.student.aggregate([
    { "$group": {
        "_id": "$rollNo",
        "count": { "$sum": 1 }
    }}
],function(err,result) {

});

这将打印每个卷号,然后计数。我的收藏非常庞大,因此难以追踪。还有其他更简单的方法可以达到这个目的吗?

3 个答案:

答案 0 :(得分:3)

为了获得不同字段的计数,您可以利用distinct command来返回字段的不同值数组;你可以检查一下数组的长度。

db.student.distinct("rollNo").length

为了打印出现次数超过一的滚动条,您可以在分组后利用$match运算符:

db.student.aggregate([     
    {"$group": {"_id": "$rollNo", "count": { "$sum": 1 }}}, 
    {"$match": {count: {"$gt": 1}}} 
])

答案 1 :(得分:1)

Mongodb允许我们根据文档的字段获取不同的值。

db.student.distinct("rollNo");

此命令返回[123,111]

db.student.distinct("rollNo").length;

此shell命令将返回不同rollNo字段的计数。

您也可以使用reduce方法计算特定键。这是mongodb doc

db.student.group({
   key: { rollNo: 1 },
   reduce: function(cur, result) { result.count += cur.count },
   initial: { count: 0 }
});

所以你会得到这样的结果集;

[
  { rollNo: 123, count: 2 },
  { rollNo: 111, count: 1 }
]

我不知道您使用的是哪个java库(或只是mongodb驱动程序),但您可以将mongo shell命令调整到您的代码中。

答案 2 :(得分:0)

您可以进一步扩展您的管道,如下所示。这不会完全解决您的问题。但是它的输出包含的记录要少得多,您可以在app中轻松处理。

pipeline = [
  { 
    "$group": {
      "_id": "$rollNo",
      "count": { "$sum": 1 }
    }
  },
  {
    $group: {
      _id: '$count',
      rollNos: {$addToSet: '$_id'},
      rollCount: {$sum: 1}
    }
  }
];

上面给出了每个计数的不同角色编号。您现在可以遍历结果以查找总计rollCount。过滤出现多次的get rollNos。