Mongodb:如何按对象列表分组
我有一个下面的学生集合,它有列表可选,并且正在按列表聚合集合组Mongodb:如何按对象列表分组,mongodb,grails,groovy,gorm,Mongodb,Grails,Groovy,Gorm,我有一个下面的学生集合,它有列表可选,并且正在按列表聚合集合组 { "_id" : "57e3e55c638cb8b971", "firstName" : "St1_firstName", "lastName" : "St1_lastName", "email" : "St1_firstname.lastName@xxx.com", "subjects" : [ { "_id" : "35a344d888dd8
{
"_id" : "57e3e55c638cb8b971",
"firstName" : "St1_firstName",
"lastName" : "St1_lastName",
"email" : "St1_firstname.lastName@xxx.com",
"subjects" : [
{
"_id" : "35a344d888dd8b363",
"code" : "00 00 00",
"name" : "subject1"
},
{
"_id" : "23a344d888dd8b335",
"code" : "01 00 00",
"name" : "subject2"
},
{
"_id" : "45a344d888dd8b987",
"code" : "01 01 00",
"name" : "subject3"
}
],
"category" : {
"_id" : "76a344d888dd8b887",
"label" : "label"
},
"classroom" : {
"_id" : "5877df01937e1f97942c9e06"
}
}
下面是用于按列表聚合集合组的GORM代码段
DBObject unwind = new BasicDBObject('_id',new BasicDBObject('$unwind','$subjects'))
unwind.append('subjects','$subjects.code')
unwind.append('count', new BasicDBObject('$sum', 1))
DBObject group = new BasicDBObject('$group', unwind)
queryPipe << group
这不起作用,你能更正代码吗
当我尝试使用以下完整代码时获取NullPointerException
List queryPipe = []
DBObject matchclassroom = new BasicDBObject('$match', new BasicDBObject('classroom', params.classroom))
queryPipe << matchclassroom
final DBObject unwind = new BasicDBObject('$unwind', '$students')
final DBObject groupFields = new BasicDBObject('_id', '$students.code')
groupFields.put("count", new BasicDBObject('$sum', 1))
final DBObject group = new BasicDBObject('$group', groupFields)
queryPipe << group
List facetsList = []
Student.collection.aggregate(queryPipe).each { fct ->
def studentsList = fct.'_id'.student
}
您在代码结构方面犯了一些错误
DBObject unwind = new BasicDBObject('_id',new BasicDBObject('$unwind','$subjects'))
这里,创建$unwind对象
DBObject group = new BasicDBObject('$group', unwind)
这里,创建$group对象。但是,您为$group对象的内部添加了$unwind对象。我需要统计出现的次数,这是用于展开的方式。追加'count',新的BasicDBObject'$sum',1设置无效运算符'$unwind error',即使我正在使用上述两行代码,为什么您要将unwind pipeline对象分配给$group pipeline对象,你能告诉我你遇到了什么错误吗?试着这样做,DBObject unwind=new basicdbobobject''u id',new basicdbobobject'$unwind','$subjects';DBObject group=new BasicDBObject['$group':['\u id':'$subjects.code','count':['$sum':1]];AggregationOutput AggregationOutput=collection.aggregate[unwind,group];aggregationOutput.results.each{dbObject->//对结果做点什么}在上述代码实现List queryPipe=[]dbObject matchroom=new BasicDBObject'$match',new BasicDBObject'School',params.planroom queryPipe然后Studen.collection.aggregatequeryPipe.each之前{fct->String subjectId=fct.''u id'。如果subjectId{subjectInfo=Subject.getsubjectId?.properties.subMap'id',label'}facetsList,主题映射subjectInfo是否有任何更新?