10000 (DOCSP-29210): CRUD > Search Geospatially page by cbullinger · Pull Request #13 · mongodb/docs-kotlin · GitHub
[go: up one dir, main page]

Skip to content

(DOCSP-29210): CRUD > Search Geospatially page #13

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 18, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
(DOCSP-29210): CRUD > Search Geospatially page
  • Loading branch information
cbullinger committed May 5, 2023
commit 36db4e8c9e36ae8265f76b2db0d0b5b147018f03
123 changes: 123 additions & 0 deletions examples/src/test/kotlin/GeoTest.kt
10000
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import com.mongodb.client.model.Aggregates
import com.mongodb.client.model.Filters
import com.mongodb.client.model.Filters.geoWithin
import com.mongodb.client.model.Filters.near
import com.mongodb.client.model.Indexes
import com.mongodb.client.model.Projections.*
import com.mongodb.client.model.Sorts
import com.mongodb.client.model.geojson.Point
import com.mongodb.client.model.geojson.Polygon
import com.mongodb.client.model.geojson.Position
import com.mongodb.kotlin.client.coroutine.MongoClient
import com.mongodb.kotlin.client.coroutine.MongoCollection
import io.github.cdimascio.dotenv.dotenv
import kotlinx.coroutines.flow.forEach
import kotlinx.coroutines.flow.toList
import kotlinx.coroutines.runBlocking
import org.bson.Document
import org.junit.jupiter.api.AfterAll
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.TestInstance
import java.util.*
import java.util.stream.Collectors.toList
import kotlin.test.*


@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class SearchGeospatialTest {

companion object {
val dotenv = dotenv()
val client = MongoClient.create(dotenv["MONGODB_CONNECTION_URI"])
val database = client.getDatabase("sample_mflix")
val collection = database.getCollection<Document>("theaters")

@AfterAll
@JvmStatic
private fun afterAll() {
runBlocking {
collection.deleteMany(Filters.empty())
client.close()

}
}
}
@Ignore
fun indexTest() = runBlocking {
// :snippet-start: geo2dsphere-index
collection.createIndex((Indexes.geo2dsphere("location.geo")))
// :snippet-end:
// :snippet-start: geo2d-index
collection.createIndex((Indexes.geo2d("coordinates")))
// :snippet-end:
}

@Test
fun geospatialQueryTest() = runBlocking {
// :snippet-start: proximity-query
val database = client.getDatabase("sample_mflix")
val collection: MongoCollection<Document> = database.getCollection("theaters")
val centralPark = Point(Position(-73.9667, 40.78))
val query = near("location.geo", centralPark, 10000.0, 5000.0)
val projection = fields(include("location.address.city"), excludeId())
collection.find(query)
.projection(projection)
.toList().forEach { println(it) }
// :snippet-end:
collection.aggregate<Document>(listOf(query)).toList().forEach { println(it.toJson()) }
// val expectedDocuments = listOf(
// Document("location", Document("address", Document("city", "Bronx"))),
// Document("location", Document("address", Document("city", "New York"))),
// Document("location", Document("address", Document("city", "New York"))),
// Document("location", Document("address", Document("city", "Long Island City"))),
// Document("location", Document("address", Document("city", "New York"))),
// Document("location", Document("address", Document("city", "Secaucus"))),
// Document("location", Document("address", Document("city", "Jersey City"))),
// Document("location", Document("address", Document("city", "Elmhurst"))),
// Document("location", Document("address", Document("city", "Flushing"))),
// Document("location", Document("address", Document("city", "Flushing"))),
// Document("location", Document("address", Document("city", "Flushing"))),
// Document("location", Document("address", Document("city", "Elmhurst")))
// )
// val actualDocuments = collection.find<Document>(geoWithinComparison)
// .projection(projection)
// .toList()
// assertEquals(expectedDocuments, actualDocuments)
}

@Test
fun queryRangeTest() = runBlocking {
val database = client.getDatabase("sample_mflix")
val collection: MongoCollection<Document> = database.getCollection("theaters")
// :snippet-start: query-range

val longIslandTriangle = Polygon(
listOf(
Position(-72.0, 40.0),
Position(-74.0, 41.0),
Position(-72.0, 39.0),
Position(-72.0, 40.0)
)
)
val projection = fields(
include("location.address.city"),
excludeId()
)
val geoWithinComparison = geoWithin("location.geo", longIslandTriangle)
collection.find<Document>(geoWithinComparison)
.projection(projection)
.toList().forEach { println(it.toJson()) }
// :snippet-end:
val expectedDocuments = listOf(
Document("location", Document("address", Document("city", "Baldwin"))),
Document("location", Document("address", Document("city", "Levittown"))),
Document("location", Document("address", Document("city", "Westbury"))),
Document("location", Document("address", Document("city", "Mount Vernon"))),
Document("location", Document("address", Document("city", "Massapequa"))),
)
val actualDocuments = collection.find<Document>(geoWithinComparison)
.projection(projection)
.toList().forEach { println(it.toJson()) }
assertEquals(expectedDocuments, actualDocuments)
}
}
1 change: 1 addition & 0 deletions source/examples/generated/GeoTest.snippet.geo2d-index.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
collection.createIndex((Indexes.geo2d("coordinates")))
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
collection.createIndex((Indexes.geo2dsphere("location.geo")))
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
val database = client.getDatabase("sample_mflix")
val collection: MongoCollection<Document> = database.getCollection("theaters")
val centralPark = Point(Position(-73.9667, 40.78))
val query = near("location.geo", centralPark, 10000.0, 5000.0)
val projection = fields(include("location.address.city"), excludeId())
collection.find(query)
.projection(projection)
.toList().forEach { println(it) }
13 changes: 13 additions & 0 deletions source/examples/generated/GeoTest.snippet.query-range.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
val longIslandTriangle = Polygon(
listOf(
Position(-72.0, 40.0),
Position(-74.0, 41.0),
Position(-72.0, 39.0),
Position(-72.0, 40.0)
)
)
val projection = fields(include("location.address.city"), excludeId())
val geoWithinComparison = geoWithin("location.geo", longIslandTriangle)
collection.find<Document>(geoWithinComparison)
.projection(projection)
.toList().forEach { println("testing testing: " + it.toJson()) }
44 changes: 16 additions & 28 deletions source/fundamentals/crud/read-operations/geo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Overview
--------

In this guide, you can learn how to search **geospatial data** with the
MongoDB Java Driver, and the different geospatial data formats supported by MongoDB.
MongoDB Kotlin Driver, and the different geospatial data formats supported by MongoDB.

Geospatial data is data that represents a geographical location on
the surface of the Earth. Examples of geospatial data include:
Expand Down Expand Up @@ -92,10 +92,8 @@ To query data stored in the GeoJSON format, add the field containing
GeoJSON data to a ``2dsphere`` index. The following snippet creates a
``2dsphere`` index on the ``location.geo`` field using the ``Indexes`` builder:

.. code-block:: java

// <MongoCollection setup code here>
collection.createIndex(Indexes.geo2dsphere("location.geo"));
.. literalinclude:: /examples/generated/GeoTest.snippet.geo2dsphere-index.kt
:language: kotlin

For more information on the ``Indexes`` builder, see our
:doc:`guide on the Indexes builder </fundamentals/builders/indexes>`.
Expand Down Expand Up @@ -125,10 +123,8 @@ To query data stored as legacy coordinate pairs, you must add the field containi
legacy coordinate pairs to a ``2d`` index. The following snippet creates a
``2d`` index on the ``coordinates`` field using the ``Indexes`` builder:

.. code-block:: java

// <MongoCollection setup code here>
collection.createIndex(Indexes.geo2d("coordinates"));
.. literalinclude:: /examples/generated/GeoTest.snippet.geo2d-index.kt
:language: kotlin

For more information on the ``Indexes`` builder, see our
:doc:`guide on the Indexes builder </fundamentals/builders/indexes>`.
Expand Down Expand Up @@ -163,7 +159,7 @@ To query your geospatial data, use one of the following query operators:
- ``$nearSphere``
- ``$geoIntersects`` *requires a 2dsphere index*

You can specify these query operators in the MongoDB Java driver with the
You can specify these query operators in the MongoDB Kotlin driver with the
``near()``, ``geoWithin()``, ``nearSphere()``, and ``geoIntersects()`` utility
methods of the ``Filters`` builder class.

Expand All @@ -180,11 +176,11 @@ Query Parameters

To specify a shape to use in a geospatial query, use the
``Position``, ``Point``, ``LineString``, and ``Polygon`` classes of the MongoDB
Java driver.
Kotlin driver.

For a full list of the GeoJSON shapes available in the MongoDB Java driver, see the
For a full list of the GeoJSON shapes available in the MongoDB Kotlin driver, see the
`GeoJSON package
<{+api+}/apidocs/mongodb-driver-core/com/mongodb/client/model/geojson/package-summary.html>`__
<TODO:(DOCSP-29169)>`__
API Documentation.

.. external resource
Expand All @@ -202,11 +198,7 @@ on the ``location.geo`` field.

The examples require the following imports:

.. literalinclude:: /includes/fundamentals/code-snippets/Geo.java
:language: java
:dedent:
:start-after: begin exampleImports
:end-before: end exampleImports
.. include:: /includes/fundamentals/imports/geo-imports.rst

You can find the
`source code for the examples on Github here <https://github.com/mongodb/docs-java/blob/master/source/includes/fundamentals/code-snippets/Geo.java>`__.
Expand All @@ -224,11 +216,10 @@ The following example queries for theaters between ``10,000`` and ``5,000``
meters from the
`Great Lawn of Central Park <https://en.wikipedia.org/wiki/Great_Lawn_and_Turtle_Pond>`__.

.. literalinclude:: /includes/fundamentals/code-snippets/Geo.java
:language: java
:dedent:
:start-after: begin findExample
:end-before: end findExample
.. external resource

.. literalinclude:: /examples/generated/GeoTest.snippet.proximity-query.kt
:language: kotlin

The output of the code snippet should look something like this:

Expand Down Expand Up @@ -271,11 +262,8 @@ The following example searches for movie theaters in a section of Long Island.

.. _example_range_query:

.. literalinclude:: /includes/fundamentals/code-snippets/Geo.java
:language: java
:dedent:
:start-after: begin rangeExample
:end-before: end rangeExample
.. literalinclude:: /examples/generated/GeoTest.snippet.query-range.kt
:language: kotlin

The output of the code snippet should look something like this:

Expand Down
Empty file.
0