Есть ли более чистый способ сделать этот групповой запрос в MongoDB от Groovy? - PullRequest
0 голосов
/ 03 февраля 2011

Я работаю над изучением 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 голосов
/ 03 февраля 2011

Это должно иметь возможность изменить весь метод на этот (но у меня нет 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]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...