我有一个像
这样的集合_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) {
});
这将打印每个卷号,然后计数。我的收藏非常庞大,因此难以追踪。还有其他更简单的方法可以达到这个目的吗?
答案 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。