【问题标题】:Mongodb:how to group by list of objectsMongodb:如何按对象列表分组
【发布时间】: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


【解决方案1】:

您在代码结构方面犯了一些错误。

DBObject unwind =  new BasicDBObject('_id',new BasicDBObject('$unwind','$subjects'))

在这里,创建 $unwind 对象。

DBObject group = new BasicDBObject('$group', unwind)

在这里,创建 $group 对象。但是,您在 $group 对象内部添加了 $unwind 对象。

【讨论】:

  • 我需要计算没有出现的次数,这是使用的方式 unwind.append('count', new BasicDBObject('$sum', 1))
  • 得到无效操作符'$unwind 错误,即使我使用上面的 2 行代码
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 2022-01-21
  • 2016-09-09
相关资源
最近更新 更多