如何使用WithinCircle和另一个术语查询MongoDB?

时间:2013-08-05 21:59:13

标签: mongodb grails groovy criteria

如何在MongoDB中查询地理空间位置和其他术语(例如标签或类别)?我尝试了以下标准

searchResults = Company.withCriteria {
    withinCircle( [50d,8.5d], 60  )
    inList('tags', tagName)
}

但看起来“withinCircle”并未针对标准实施。还有其他技术吗?使用动态查找器“findAllBy ... And ...”也没有用:

Company.findAllByTagsAndLocationWithinCircle( tagName, [ [50d, 8.5d], 60 ] )

(两者都给我一个“groovy.lang.MissingMethodException:没有方法签名......”错误。)

我是否错过了某些内容,或者通过低级API(gmongo)等方式有什么办法吗?

域类看起来像:

class Company {
    ObjectId     id
    Set          tags     = []                      // a set of ObjectID referencing Tags
    List<String> tagList  = new ArrayList<String>() // a list of names from the Tags
}

class Tags {
    ObjectId     id
    Set          companies = []                    // a set of ObjectID referencing Companies
}

BtW:Company.tags和Company.tagList是同步的,仅用于测试(我从标签开始,但认为tagList可以帮助搜索)

1 个答案:

答案 0 :(得分:1)

更新:

class Company {
    ObjectId id
    List location

    static hasMany = [tags: Tag]

    static mapping = {
        location geoIndex:true
    }
    .....
    //static mapWith = 'mongo' //if required
}

class Tags {
    ObjectId id
    String name
    .......
    //static mapWith = 'mongo' //if required
}

根据以上域名类别,以下标准将为您提供所需的内容。如果映射是正确的以及您需要什么,请纠正。

标准中未使用AFAIK inList。您可以尝试使用以下标准:

searchResults = Company.withCriteria {
    withinCircle('location', [[50d,8.5d], 60])
    tags{
       eq('name', tagName)
    }
}

考虑到我在withinCircle上面的评论,并假设tagName是一个列表。

(*未经测试)或者,使用动态查询,它将是

def companies = Company.findAllByLocationWithinCircle([[50d, 8.5d], 60]).findAll{
    tagName in it.tags*.name   
}

如果withinCircle没有与动态查找器的组合齐头并进,那么它也可以被打破(这可能是资源消耗)。