首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >reactivemongo中的"$centerSphere“查询

reactivemongo中的"$centerSphere“查询
EN

Stack Overflow用户
提问于 2015-02-17 10:40:21
回答 1查看 205关注 0票数 0

我在这里找到了单击此处

我想在reactivemongo中进行"2d“索引,然后在reactivemongo中使用以下查询

代码语言:javascript
复制
db.collName.find({
    loc: {
    $geoWithin: {
        $centerSphere: [
            [lng, lat], radius / 6371
        ]
    }
    }
})

如何在reactivemongo中实现?

任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-17 15:19:25

在reactivemongo中,此查询如下所示:

代码语言:javascript
复制
def findNear(lng: Double, lat: Double, radius: Double)(implicit fomrat: Format[T], ec: ExecutionContext): Enumerator[T] = {
        collection().
            find(Json.obj("loc" -> Json.obj("$geoWithin" -> Json.obj("$centerSphere" -> Json.arr(Json.arr(lng, lat), JsNumber(radius / 6371)))))).
            cursor[T].
            enumerate()
    }

我玩过简单的案例类,来测试这个:

代码语言:javascript
复制
case class Company(name: String, loc: Point)

case class Point(lon: Double, lat: Double)

object Company extends MongoCollection[Company] {

    implicit val pointFormat: Format[Point]  = Json.format[Point]
    implicit val companyFormat: Format[Company] = Json.format[Company]

    val collectionName = "company"

    def findNear(lng: Double, lat: Double, radius: Double)(implicit ec: ExecutionContext): Enumerator[Company] = {
        collection().
            find(Json.obj("loc" -> Json.obj("$geoWithin" -> Json.obj("$centerSphere" -> Json.arr(Json.arr(lng, lat), JsNumber(radius / 6371)))))).
            cursor[Company].
            enumerate()
    }

}

和试验

代码语言:javascript
复制
object CompanySpec extends Specification with NoTimeConversions {

    sequential

    "geo spatial" should {

        val A = Company("A", Point(0, 0))
        val B = Company("B", Point(0, 1))
        val C = Company("C", Point(1, 1))
        val D = Company("D", Point(1, 0))

        Company.saveAll(List(A, B, C, D)).await()

        "return A " in {
            Company.findNear(0, 0, 1).collect().await() shouldEqual List(A)
        }

        "return A, B, C" in {

            Company.findNear(0, 0, 120).collect().await() shouldEqual List(A, B, D)
        }

        "return D" in {
            Company.findNear(0, 0, 240).collect().await() shouldEqual List(A, B, C, D)
        }

    }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28560052

复制
相关文章

相似问题

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