现存数据:三个学生的学号,姓名及科目考试信息,其中科目是一个集合数组文档,具体数据如下:
{
"_id" : ObjectId("6009179ac73cb830a50c9520"),
"idNo" : "00001",
"name" : "jack",
"major" : [
{
"cName" : "马克思理论",
"cCode" : "0.001",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-11 11:00:00"
}
]
}
{
"_id" : ObjectId("6009179ac73cb830a50c9521"),
"idNo" : "00008",
"name" : "tom",
"major" : [
{
"cName" : "PS",
"cCode" : "10.001",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "PS",
"cCode" : "10.002",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00"
}
]
}
{
"_id" : ObjectId("6009179ac73cb830a50c9522"),
"idNo" : "00009",
"name" : "Jerry",
"major" : [
{
"cName" : "影视",
"cCode" : "11.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "80",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "动漫",
"cCode" : "7.001",
"type" : "1",
"core" : "88",
"date" : "2021-01-21 12:00:00"
}
]
}
{
"_id" : ObjectId("6009179ac73cb830a50c9344"),
"idNo" : "00010",
"name" : "Rose",
"major" : [
{
"cName" : "影视",
"cCode" : "11.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "88",
"date" : "2021-01-21 12:00:00"
},
{
"cName" : "动漫",
"cCode" : "7.001",
"type" : "1",
"core" : "66",
"date" : "2021-01-21 12:00:00"
}
]
}
-
现有需求1,给每个学生添加科目数以及每个科目增加seqNo顺序号
实现思路:先循环每个学生拿到科目集合数组,再去循环科目,增加seqNo节点
实现代码:
db.getCollection("test").find({}).forEach(function (item) {
var array = item.major; // 科目集合
item.count=array.length; // 科目数
array.forEach(function (ele, index) {
ele.seqNo = (index + 1) + ""; // index为节点ele下标,从0开始
db.getCollection('test').save(item) // 更新数据
})
})
实现结果:
{
"_id" : ObjectId("6009179ac73cb830a50c9520"),
"idNo" : "00001",
"name" : "jack",
"major" : [
{
"cName" : "马克思理论",
"cCode" : "0.001",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00",
"seqNo" : "1"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00",
"seqNo" : "2"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-11 11:00:00",
"seqNo" : "3"
}
],
"count" : 3.0
}
{
"_id" : ObjectId("6009179ac73cb830a50c9521"),
"idNo" : "00008",
"name" : "tom",
"major" : [
{
"cName" : "PS",
"cCode" : "10.001",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00",
"seqNo" : "1"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00",
"seqNo" : "2"
},
{
"cName" : "PS",
"cCode" : "10.002",
"type" : "1",
"core" : "90",
"date" : "2021-01-21 12:00:00",
"seqNo" : "3"
}
],
"count" : 3.0
}
{
"_id" : ObjectId("6009179ac73cb830a50c9522"),
"idNo" : "00009",
"name" : "Jerry",
"major" : [
{
"cName" : "影视",
"cCode" : "11.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-21 12:00:00",
"seqNo" : "1"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00",
"seqNo" : "2"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "80",
"date" : "2021-01-21 12:00:00",
"seqNo" : "3"
},
{
"cName" : "动漫",
"cCode" : "7.001",
"type" : "1",
"core" : "88",
"date" : "2021-01-21 12:00:00",
"seqNo" : "4"
}
],
"count" : 4.0
}
{
"_id" : ObjectId("6009179ac73cb830a50c9344"),
"idNo" : "00010",
"name" : "Rose",
"major" : [
{
"cName" : "影视",
"cCode" : "11.001",
"type" : "2",
"core" : "100",
"date" : "2021-01-21 12:00:00",
"seqNo" : "1"
},
{
"cName" : "java并发编码",
"cCode" : "1.001",
"type" : "1",
"core" : "80",
"date" : "2021-01-21 12:00:00",
"seqNo" : "2"
},
{
"cName" : "mongo",
"cCode" : "2.001",
"type" : "2",
"core" : "88",
"date" : "2021-01-21 12:00:00",
"seqNo" : "3"
},
{
"cName" : "动漫",
"cCode" : "7.001",
"type" : "1",
"core" : "66",
"date" : "2021-01-21 12:00:00",
"seqNo" : "4"
}
],
"count" : 4.0
}
-
现有需求2,查出相同科目数的学生人数
实现思路:在数据库里可以换个角度思考需求的意思,实际上可以理解为根据科目数分组,那么就可以使用聚合函数aggregate实现统计
实现代码:
db.getCollection('test').aggregate(
{
'$group': {
'_id': { //_id 即分组条件
'majorCount': '$count' // 根据count分组
},
'count': { '$sum': 1 } // 统计count的相同的学生人数
}
},
{
'$match': {
'count': { '$gt': 1 } //将分组后的数据,进行过滤
}
}
)
实现结果:4个科目数的有2人,3个科目数的有2人
{
"_id" : {
"majorCount" : 4.0
},
"count" : 2.0
}
{
"_id" : {
"majorCount" : 3.0
},
"count" : 2.0
}
-
现有需求3,查出相同科目数的学生姓名,学号
实现思路:在需求2的实现基础上,遍历查询学生姓名,学号
实现代码:
db.getCollection('test').aggregate(
{
'$group': {
'_id': { //_id 即分组条件
'majorCount': '$count' // 根据count分组
},
'count': { '$sum': 1 } // 统计count的相同的学生人数
}
},
{
'$match': {
'count': { '$gt': 1 } //将分组后的数据,进行过滤
}
}
).forEach(function (item) {
print("科目数为" + item._id.majorCount + "的学生是:\n")
var cursor = db.getCollection("test").find(
{
'count': item._id.majorCount
});
var doc = null;
while (cursor.hasNext()) {
doc = cursor.next();
if (doc != null) {
print(doc.idNo + "\t" + doc.name + "\n")
}
}
doc = null;
}
)
实现效果: