有没有更简洁的方法从Groovy在MongoDB中执行此组查询?

时间:2011-02-02 23:18:58

标签: java groovy mongodb

我正在学习MongoDB。当前运行的语言选择是Groovy。

通过尝试回答哪个宠物是最需要宠物的问题来处理群组查询。

以下是我的第一次尝试,而且糟糕。任何帮助清理它(或只是确认没有更清洁的方法)将非常感激。

提前致谢!

package mongo.pets

import com.gmongo.GMongo
import com.mongodb.BasicDBObject
import com.mongodb.DBObject

class StatsController {

  def dbPets = new GMongo().getDB('needsHotel').getCollection('pets')

  //FIXME OMG THIS IS AWFUL!!!
  def index = {
    def petsNeed = 'a walk'

    def reduce = 'function(doc, aggregator) { aggregator.needsCount += doc.needs.length }'
    def key = new BasicDBObject()
    key.put("name", true)
    def initial = new BasicDBObject()
    initial.put ("needsCount", 0)

    def maxNeeds = 0
    def needyPets = []
    dbPets.group(key, new BasicDBObject(), initial, reduce).each {
      if (maxNeeds < it['needsCount']) {
        maxNeeds = it['needsCount']
        needyPets = []
        needyPets += it['name']
      } else if (maxNeeds == it['needsCount']) {
        needyPets += it['name']
      }
    }

    def needyPet = needyPets

    [petsNeedingCount: dbPets.find([needs: petsNeed]).count(), petsNeed: petsNeed, mostNeedyPet: needyPet]
  }

}

1 个答案:

答案 0 :(得分:0)

可以将整个方法更改为此(但我没有MongoDB来测试它)

def index = {
  def petsNeed = 'a walk'

  def reduce = 'function(doc, aggregator) { aggregator.needsCount += doc.needs.length }'

  def key     = [ name: true    ] as BasicDBObject
  def initial = [ needsCount: 0 ] as BasicDBObject

  def allPets = dbPets.group( key, new BasicDBObject(), initial, reduce )
  def maxNeeds = allPets*.needsCount.collect { it as Integer }.max()
  def needyPet = allPets.findAll { maxNeeds == it.needsCount as Integer }.name

  [petsNeedingCount: dbPets.find([needs: petsNeed]).count(), petsNeed: petsNeed, mostNeedyPet: needyPet]
}