首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有更干净的方法在MongoDB中从Groovy执行这个组查询?

是否有更干净的方法在MongoDB中从Groovy执行这个组查询?
EN

Stack Overflow用户
提问于 2011-02-02 23:18:57
回答 1查看 513关注 0票数 0

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

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

下面是我的第一次尝试,很糟糕。任何帮助清理这个(或简单地确认没有一个更干净的方法来做它)将是非常感谢的。

提前感谢!

代码语言:javascript
复制
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]
  }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-03 09:37:58

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

代码语言:javascript
复制
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]
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4881101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档