【发布时间】:2017-03-21 08:50:26
【问题描述】:
我有一个下面的学生集合,其中包含可选列表,并且正在按列表聚合集合组。
{
"_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 sn-p
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
}
【问题讨论】:
-
你为什么将展开管道对象分配给 $group 管道对象,你能说明你得到了什么错误。
-
试试这样,DBObject unwind = new BasicDBObject('_id',new BasicDBObject('$unwind','$subjects')); DBObject group = new BasicDBObject(['$group': [ '_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('classroom', params.planroom)) queryPipe
-
然后 Studen.collection.aggregate(queryPipe).each { fct -> String subjectId = fct.'_id'.subjects 映射 subjectInfo if (subjectId) { subjectInfo= Subject.get(subjectId)?。 properties.subMap('id', 'label') } facetsList
-
你有什么更新吗?
标签: mongodb grails groovy grails-orm