Docs HomeMongoDB Manual

• Geohash Values
• Multi-Location Documents for 2d Indexes
• Embedded Multi-Location Documents

This document explains the internals of 2d indexes. This material is not necessary for normal operations or application development, but may be useful for troubleshooting and for further understanding.

When you create a geospatial index on a field that contains legacy coordinate pairs, MongoDB computes geohash values for the coordinate pairs within the specified location range, then indexes the geohash values.

To calculate a geohash value, MongoDB recursively divides a two-dimensional map into quadrants. Then, it assigns each quadrant a two-bit value. For example, a two-bit representation of four quadrants would be:

`.leafygreen-ui-1xcl9uc{color:inherit;font-size:13px;font-family:'Source Code Pro',Menlo,monospace;line-height:24px;font-size:15px;}`.leafygreen-ui-1v41da1{border-spacing:0;width:100%;}.leafygreen-ui-7razhx{border-spacing:0;vertical-align:top;padding:0 16px;}01  11.leafygreen-ui-ihxujy{display:inline-block;}00  10``

These two-bit values (`00`, `01`, `10`, and `11`) represent each of the quadrants and all points within each quadrant. Each quadrant has a corresponding geohash value:

Geohash
Bottom-left
`00`
Top-left
`01`
Bottom-right
`10`
Top-right
`11`

To provide additional precision, MongoDB can divide each quadrant into sub-quadrants. Each sub-quadrant has the geohash value of the containing quadrant concatenated with the value of the sub-quadrant. For example, the geohash for the top-right quadrant is `11`, and the geohash for the sub-quadrants would be (clockwise from the top left):

• `1101`

• `1111`

• `1110`

• `1100`

While 2d indexes do not support more than one location field in a document, you can use a multi-key index to index multiple coordinate pairs in a single document. For example, in the following document, the `locs` field holds an array of coordinate pairs:

``db.places.insertOne( {   locs : [      [ 55.5 , 42.3 ],      [ -74 , 44.74 ],      { long : 55.5 , lat : 42.3 }   ]} )``

The values in the `locs` array may be either:

• Arrays, as in `[ 55.5, 42.3 ]`.

• Embedded documents, as in `{ long : 55.5 , lat : 42.3 }`.

To index all of the coordinate pairs in the `locs` array, create a 2d index on the `locs` field:

``db.places.createIndex( { "locs": "2d" } )``

You can store location data as a field inside of an embedded document. For example, you can have an array of embedded documents where each embedded document has a field that contains location data.

In the following document, the `addresses` field is an array of embedded documents. The embedded documents contain a `loc` field, which is a coordinate pair:

``db.records.insertOne( {   name : "John Smith",   addresses : [      {         context : "home" ,         loc : [ 55.5, 42.3 ]      },      {         context : "work",         loc : [ -74 , 44.74 ]      }   ]} )``

To index all of the `loc` values in the `addresses` array, create a 2d index on the `addresses.loc` field:

``db.records.createIndex( { "addresses.loc": "2d" } )``
←  Query for Locations within a Shape on a Flat SurfaceConvert Distance to Radians for Spherical Operators →
Share Feedback