如何在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可以帮助搜索)
答案 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
没有与动态查找器的组合齐头并进,那么它也可以被打破(这可能是资源消耗)。