0

如何在 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
}

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

4

1 回答 1

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
}

基于上述域类,以下标准将为您提供所需的内容。纠正映射是否正确以及您需要什么。

AFAIKinList不用于标准。您可以尝试以下标准:

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不与动态查找器的组合齐头并进,那么它也可能被破坏(这可能会消耗资源)。

于 2013-08-06T02:47:17.173 回答