我在这里找到了单击此处
我想在reactivemongo中进行"2d“索引,然后在reactivemongo中使用以下查询
db.collName.find({
loc: {
$geoWithin: {
$centerSphere: [
[lng, lat], radius / 6371
]
}
}
})如何在reactivemongo中实现?
任何帮助都将不胜感激。
发布于 2015-02-17 15:19:25
在reactivemongo中,此查询如下所示:
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()
}我玩过简单的案例类,来测试这个:
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()
}
}和试验
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)
}
}
}https://stackoverflow.com/questions/28560052
复制相似问题