[SERVER-17469] 2d nearSphere queries may scan entire collection Created: 04/Mar/15  Updated: 25/Jan/17  Resolved: 26/Mar/15

Status: Closed
Project: Core Server
Component/s: Geo
Affects Version/s: 3.0.0-rc11
Fix Version/s: 3.0.2, 3.1.1

Type: Bug Priority: Major - P3
Reporter: Michael Kania Assignee: Siyuan Zhou
Resolution: Done Votes: 1
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Attachments: File 2d-regression-date-range.tar.gz     File 2d-regression.tar.gz    
Issue Links:
Depends
Backwards Compatibility: Fully Compatible
Operating System: ALL
Backport Completed:
Steps To Reproduce:

Start with a collection with a ~500k documents

db.getCollection("some_collection:Place").count()
583104

2.6.5 nearSphere query with explain()

> db.getCollection("some_collection:Place").find({location: { $nearSphere: [ 106.6331, 10.7395 ] }}).explain()
{
	"cursor" : "GeoSearchCursor",
	"isMultiKey" : false,
	"n" : 100,
	"nscannedObjects" : 599,
	"nscanned" : 3692,
	"nscannedObjectsAllPlans" : 599,
	"nscannedAllPlans" : 3692,
	"scanAndOrder" : false,
	"indexOnly" : false,
	"nYields" : 0,
	"nChunkSkips" : 0,
	"millis" : 5,
	"indexBounds" : {
		
	}

Run same query with explain("executionStats") on 3.0.0-rc11

db.getCollection("some_collection:Place").find({location: { $nearSphere: [ 106.6331, 10.7395 ] }}).explain("executionStats")
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.some_collection:Place",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"location" : {
				"$nearSphere" : [
					106.6331,
					10.7395
				]
			}
		},
		"winningPlan" : {
			"stage" : "GEO_NEAR_2D",
			"keyPattern" : {
				"location" : "2d"
			},
			"indexName" : "location_2d",
			"inputStages" : [
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F97C000000000), BinData(128, E09F97FFFFFFFFFF)]",
								"[BinData(128, E09F9C0000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FB40000000000), BinData(128, E09FB7FFFFFFFFFF)]",
								"[BinData(128, E09FBC0000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD28000000000), BinData(128, E09FD2BFFFFFFFFF)]",
								"[BinData(128, E09FD2E000000000), BinData(128, E09FD2EFFFFFFFFF)]",
								"[BinData(128, E09FD80000000000), BinData(128, E09FDBFFFFFFFFFF)]",
								"[BinData(128, E09FDE8000000000), BinData(128, E09FDEBFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5150000000000), BinData(128, E0B515FFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B543FFFFFFFFFF)]",
								"[BinData(128, E0B5440000000000), BinData(128, E0B547FFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B550FFFFFFFFFF)]",
								"[BinData(128, E0B5510000000000), BinData(128, E0B5513FFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F3C0000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F780000000000), BinData(128, E09F7BFFFFFFFFFF)]",
								"[BinData(128, E09F900000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FA40000000000), BinData(128, E09FA7FFFFFFFFFF)]",
								"[BinData(128, E09FB00000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD00000000000), BinData(128, E09FDFFFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5100000000000), BinData(128, E0B51FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B54FFFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B55FFFFFFFFFFF)]",
								"[BinData(128, E0CA8A0000000000), BinData(128, E0CA8AFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAA3FFFFFFFFFF)]",
								"[BinData(128, E0CAA80000000000), BinData(128, E0CAABFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F3B0000000000), BinData(128, E09F3BFFFFFFFFFF)]",
								"[BinData(128, E09F3C0000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F700000000000), BinData(128, E09F7FFFFFFFFFFF)]",
								"[BinData(128, E09F800000000000), BinData(128, E09F8FFFFFFFFFFF)]",
								"[BinData(128, E09F900000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FA00000000000), BinData(128, E09FAFFFFFFFFFFF)]",
								"[BinData(128, E09FB00000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5050000000000), BinData(128, E0B505FFFFFFFFFF)]",
								"[BinData(128, E0B5100000000000), BinData(128, E0B51FFFFFFFFFFF)]",
								"[BinData(128, E0B5354000000000), BinData(128, E0B5357FFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CA8FFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAAFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E003FFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F2C0000000000), BinData(128, E09F2FFFFFFFFFFF)]",
								"[BinData(128, E09F300000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F4B0000000000), BinData(128, E09F4BFFFFFFFFFF)]",
								"[BinData(128, E09F4C0000000000), BinData(128, E09F4FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F700000000000), BinData(128, E09F7FFFFFFFFFFF)]",
								"[BinData(128, E09F800000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B53FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0CA22AA80000000), BinData(128, E0CA22AABFFFFFFF)]",
								"[BinData(128, E0CA280000000000), BinData(128, E0CA2BFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CA8FFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAAFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E00FFFFFFFFFFF)]",
								"[BinData(128, E0E0200000000000), BinData(128, E0E020FFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09DBFFC00000000), BinData(128, E09DBFFFFFFFFFFF)]",
								"[BinData(128, E09DE00000000000), BinData(128, E09DEFFFFFFFFFFF)]",
								"[BinData(128, E09DFA8000000000), BinData(128, E09DFABFFFFFFFFF)]",
								"[BinData(128, E09E700000000000), BinData(128, E09E7FFFFFFFFFFF)]",
								"[BinData(128, E09EC00000000000), BinData(128, E09EFFFFFFFFFFFF)]",
								"[BinData(128, E09F000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B4500000000000), BinData(128, E0B45FFFFFFFFFFF)]",
								"[BinData(128, E0B4700000000000), BinData(128, E0B47FFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B53FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0B5800000000000), BinData(128, E0B5BFFFFFFFFFFF)]",
								"[BinData(128, E0B5C00000000000), BinData(128, E0B5FFFFFFFFFFFF)]",
								"[BinData(128, E0CA000000000000), BinData(128, E0CA3FFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CABFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E03FFFFFFFFFFF)]",
								"[BinData(128, E0E0800000000000), BinData(128, E0E08FFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09CC00000000000), BinData(128, E09CFFFFFFFFFFFF)]",
								"[BinData(128, E09D000000000000), BinData(128, E09DFFFFFFFFFFFF)]",
								"[BinData(128, E09E000000000000), BinData(128, E09EFFFFFFFFFFFF)]",
								"[BinData(128, E09F000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B4000000000000), BinData(128, E0B4FFFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B5FFFFFFFFFFFF)]",
								"[BinData(128, E0B6550000000000), BinData(128, E0B655FFFFFFFFFF)]",
								"[BinData(128, E0B7000000000000), BinData(128, E0B70FFFFFFFFFFF)]",
								"[BinData(128, E0B7100000000000), BinData(128, E0B71FFFFFFFFFFF)]",
								"[BinData(128, E0B7400000000000), BinData(128, E0B74FFFFFFFFFFF)]",
								"[BinData(128, E0B7500000000000), BinData(128, E0B75FFFFFFFFFFF)]",
								"[BinData(128, E0C8800000000000), BinData(128, E0C8BFFFFFFFFFFF)]",
								"[BinData(128, E0C8E00000000000), BinData(128, E0C8EFFFFFFFFFFF)]",
								"[BinData(128, E0CA000000000000), BinData(128, E0CAFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E0FFFFFFFFFFFF)]",
								"[BinData(128, E0E2000000000000), BinData(128, E0E23FFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E094000000000000), BinData(128, E097FFFFFFFFFFFF)]",
								"[BinData(128, E099000000000000), BinData(128, E099FFFFFFFFFFFF)]",
								"[BinData(128, E09B000000000000), BinData(128, E09BFFFFFFFFFFFF)]",
								"[BinData(128, E09C000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B1000000000000), BinData(128, E0B1FFFFFFFFFFFF)]",
								"[BinData(128, E0B3000000000000), BinData(128, E0B3FFFFFFFFFFFF)]",
								"[BinData(128, E0B4000000000000), BinData(128, E0B7FFFFFFFFFFFF)]",
								"[BinData(128, E0BC400000000000), BinData(128, E0BC7FFFFFFFFFFF)]",
								"[BinData(128, E0BD000000000000), BinData(128, E0BDFFFFFFFFFFFF)]",
								"[BinData(128, E0C2000000000000), BinData(128, E0C2FFFFFFFFFFFF)]",
								"[BinData(128, E0C3A00000000000), BinData(128, E0C3AFFFFFFFFFFF)]",
								"[BinData(128, E0C8000000000000), BinData(128, E0CBFFFFFFFFFFFF)]",
								"[BinData(128, E0CE000000000000), BinData(128, E0CEFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E3FFFFFFFFFFFF)]",
								"[BinData(128, E0E4000000000000), BinData(128, E0E40FFFFFFFFFFF)]",
								"[BinData(128, E0E8000000000000), BinData(128, E0E8FFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E03B000000000000), BinData(128, E03BFFFFFFFFFFFF)]",
								"[BinData(128, E03C000000000000), BinData(128, E03FFFFFFFFFFFFF)]",
								"[BinData(128, E068000000000000), BinData(128, E06BFFFFFFFFFFFF)]",
								"[BinData(128, E087000000000000), BinData(128, E087FFFFFFFFFFFF)]",
								"[BinData(128, E08C000000000000), BinData(128, E08FFFFFFFFFFFFF)]",
								"[BinData(128, E090000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0A4000000000000), BinData(128, E0A7FFFFFFFFFFFF)]",
								"[BinData(128, E0AD400000000000), BinData(128, E0AD7FFFFFFFFFFF)]",
								"[BinData(128, E0B0000000000000), BinData(128, E0BFFFFFFFFFFFFF)]",
								"[BinData(128, E0C0000000000000), BinData(128, E0CFFFFFFFFFFFFF)]",
								"[BinData(128, E0D8000000000000), BinData(128, E0DBFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0EFFFFFFFFFFFFF)]",
								"[BinData(128, E0F0000000000000), BinData(128, E0F0FFFFFFFFFFFF)]",
								"[BinData(128, E211555540000000), BinData(128, E21155557FFFFFFF)]",
								"[BinData(128, E214000000000000), BinData(128, E217FFFFFFFFFFFF)]",
								"[BinData(128, E240000000000000), BinData(128, E243FFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, B57FC00000000000), BinData(128, B57FFFFFFFFFFFFF)]",
								"[BinData(128, B5D0000000000000), BinData(128, B5DFFFFFFFFFFFFF)]",
								"[BinData(128, B5F0000000000000), BinData(128, B5FFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E03FFFFFFFFFFFFF)]",
								"[BinData(128, E040000000000000), BinData(128, E04FFFFFFFFFFFFF)]",
								"[BinData(128, E060000000000000), BinData(128, E06FFFFFFFFFFFFF)]",
								"[BinData(128, E070000000000000), BinData(128, E07FFFFFFFFFFFFF)]",
								"[BinData(128, E080000000000000), BinData(128, E0BFFFFFFFFFFFFF)]",
								"[BinData(128, E0C0000000000000), BinData(128, E0FFFFFFFFFFFFFF)]",
								"[BinData(128, E180000000000000), BinData(128, E18FFFFFFFFFFFFF)]",
								"[BinData(128, E1A0000000000000), BinData(128, E1AFFFFFFFFFFFFF)]",
								"[BinData(128, E200000000000000), BinData(128, E20FFFFFFFFFFFFF)]",
								"[BinData(128, E210000000000000), BinData(128, E21FFFFFFFFFFFFF)]",
								"[BinData(128, E230000000000000), BinData(128, E233FFFFFFFFFFFF)]",
								"[BinData(128, E234000000000000), BinData(128, E237FFFFFFFFFFFF)]",
								"[BinData(128, E240000000000000), BinData(128, E27FFFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 9FEC000000000000), BinData(128, 9FEFFFFFFFFFFFFF)]",
								"[BinData(128, 9FF0000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, B500000000000000), BinData(128, B5FFFFFFFFFFFFFF)]",
								"[BinData(128, B710000000000000), BinData(128, B71FFFFFFFFFFFFF)]",
								"[BinData(128, B740000000000000), BinData(128, B77FFFFFFFFFFFFF)]",
								"[BinData(128, B7C5000000000000), BinData(128, B7C5FFFFFFFFFFFF)]",
								"[BinData(128, B7D0000000000000), BinData(128, B7DFFFFFFFFFFFFF)]",
								"[BinData(128, CA80000000000000), BinData(128, CABFFFFFFFFFFFFF)]",
								"[BinData(128, CAC0000000000000), BinData(128, CAFFFFFFFFFFFFFF)]",
								"[BinData(128, CB80000000000000), BinData(128, CBBFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E0FFFFFFFFFFFFFF)]",
								"[BinData(128, E100000000000000), BinData(128, E1FFFFFFFFFFFFFF)]",
								"[BinData(128, E200000000000000), BinData(128, E2FFFFFFFFFFFFFF)]",
								"[BinData(128, E300000000000000), BinData(128, E33FFFFFFFFFFFFF)]",
								"[BinData(128, E340000000000000), BinData(128, E343FFFFFFFFFFFF)]",
								"[BinData(128, E380000000000000), BinData(128, E3BFFFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 9D00000000000000), BinData(128, 9DFFFFFFFFFFFFFF)]",
								"[BinData(128, 9E00000000000000), BinData(128, 9EFFFFFFFFFFFFFF)]",
								"[BinData(128, 9F00000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, B400000000000000), BinData(128, B7FFFFFFFFFFFFFF)]",
								"[BinData(128, BC40000000000000), BinData(128, BC7FFFFFFFFFFFFF)]",
								"[BinData(128, BD00000000000000), BinData(128, BDFFFFFFFFFFFFFF)]",
								"[BinData(128, C800000000000000), BinData(128, CBFFFFFFFFFFFFFF)]",
								"[BinData(128, CE00000000000000), BinData(128, CEFFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E3FFFFFFFFFFFFFF)]",
								"[BinData(128, E400000000000000), BinData(128, E4FFFFFFFFFFFFFF)]",
								"[BinData(128, E600000000000000), BinData(128, E6FFFFFFFFFFFFFF)]",
								"[BinData(128, E800000000000000), BinData(128, E8FFFFFFFFFFFFFF)]",
								"[BinData(128, E900000000000000), BinData(128, E9FFFFFFFFFFFFFF)]",
								"[BinData(128, EA00000000000000), BinData(128, EA3FFFFFFFFFFFFF)]",
								"[BinData(128, EA40000000000000), BinData(128, EA7FFFFFFFFFFFFF)]",
								"[BinData(128, EC00000000000000), BinData(128, EC3FFFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 3B00000000000000), BinData(128, 3BFFFFFFFFFFFFFF)]",
								"[BinData(128, 3C00000000000000), BinData(128, 3FFFFFFFFFFFFFFF)]",
								"[BinData(128, 6800000000000000), BinData(128, 6BFFFFFFFFFFFFFF)]",
								"[BinData(128, 6C00000000000000), BinData(128, 6FFFFFFFFFFFFFFF)]",
								"[BinData(128, 8400000000000000), BinData(128, 87FFFFFFFFFFFFFF)]",
								"[BinData(128, 8C00000000000000), BinData(128, 8FFFFFFFFFFFFFFF)]",
								"[BinData(128, 9000000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, A400000000000000), BinData(128, A7FFFFFFFFFFFFFF)]",
								"[BinData(128, AC00000000000000), BinData(128, AFFFFFFFFFFFFFFF)]",
								"[BinData(128, B000000000000000), BinData(128, BFFFFFFFFFFFFFFF)]",
								"[BinData(128, C000000000000000), BinData(128, CFFFFFFFFFFFFFFF)]",
								"[BinData(128, D000000000000000), BinData(128, D3FFFFFFFFFFFFFF)]",
								"[BinData(128, D800000000000000), BinData(128, DBFFFFFFFFFFFFFF)]",
								"[BinData(128, DC00000000000000), BinData(128, DFFFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, EFFFFFFFFFFFFFFF)]",
								"[BinData(128, F000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 0000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						}
					}
				},
				{
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 0000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						}
					}
				}
			]
		},
		"rejectedPlans" : [ ]
	},
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 583104,
		"executionTimeMillis" : 28562,
		"totalKeysExamined" : 8163456,
		"totalDocsExamined" : 8163456,
		"executionStages" : {
			"stage" : "GEO_NEAR_2D",
			"nReturned" : 583104,
			"executionTimeMillisEstimate" : 27177,
			"works" : 8746590,
			"advanced" : 583104,
			"needTime" : 8163485,
			"needFetch" : 0,
			"saveState" : 68334,
			"restoreState" : 68334,
			"isEOF" : 1,
			"invalidates" : 0,
			"keyPattern" : {
				"location" : "2d"
			},
			"indexName" : "location_2d",
			"searchIntervals" : [
				{
					"minDistance" : 0,
					"maxDistance" : 20037.39210386106,
					"maxInclusive" : false
				},
				{
					"minDistance" : 20037.39210386106,
					"maxDistance" : 30056.088155791593,
					"maxInclusive" : false
				},
				{
					"minDistance" : 30056.088155791593,
					"maxDistance" : 35065.43618175686,
					"maxInclusive" : false
				},
				{
					"minDistance" : 35065.43618175686,
					"maxDistance" : 45084.132233687385,
					"maxInclusive" : false
				},
				{
					"minDistance" : 45084.132233687385,
					"maxDistance" : 65121.52433754844,
					"maxInclusive" : false
				},
				{
					"minDistance" : 65121.52433754844,
					"maxDistance" : 105196.30854527056,
					"maxInclusive" : false
				},
				{
					"minDistance" : 105196.30854527056,
					"maxDistance" : 185345.8769607148,
					"maxInclusive" : false
				},
				{
					"minDistance" : 185345.8769607148,
					"maxDistance" : 345645.01379160327,
					"maxInclusive" : false
				},
				{
					"minDistance" : 345645.01379160327,
					"maxDistance" : 666243.2874533802,
					"maxInclusive" : false
				},
				{
					"minDistance" : 666243.2874533802,
					"maxDistance" : 1307439.8347769342,
					"maxInclusive" : false
				},
				{
					"minDistance" : 1307439.8347769342,
					"maxDistance" : 2589832.929424042,
					"maxInclusive" : false
				},
				{
					"minDistance" : 2589832.929424042,
					"maxDistance" : 5154619.118718257,
					"maxInclusive" : false
				},
				{
					"minDistance" : 5154619.118718257,
					"maxDistance" : 10284191.49730669,
					"maxInclusive" : false
				},
				{
					"minDistance" : 10284191.49730669,
					"maxDistance" : 20037392.10386106,
					"maxInclusive" : true
				}
			],
			"inputStages" : [
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1090,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 68334,
					"restoreState" : 68334,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 840,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 68334,
						"restoreState" : 68334,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F97C000000000), BinData(128, E09F97FFFFFFFFFF)]",
								"[BinData(128, E09F9C0000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FB40000000000), BinData(128, E09FB7FFFFFFFFFF)]",
								"[BinData(128, E09FBC0000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD28000000000), BinData(128, E09FD2BFFFFFFFFF)]",
								"[BinData(128, E09FD2E000000000), BinData(128, E09FD2EFFFFFFFFF)]",
								"[BinData(128, E09FD80000000000), BinData(128, E09FDBFFFFFFFFFF)]",
								"[BinData(128, E09FDE8000000000), BinData(128, E09FDEBFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5150000000000), BinData(128, E0B515FFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B543FFFFFFFFFF)]",
								"[BinData(128, E0B5440000000000), BinData(128, E0B547FFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B550FFFFFFFFFF)]",
								"[BinData(128, E0B5510000000000), BinData(128, E0B5513FFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1110,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 59279,
					"restoreState" : 59279,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 760,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 59279,
						"restoreState" : 59279,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F3C0000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F780000000000), BinData(128, E09F7BFFFFFFFFFF)]",
								"[BinData(128, E09F900000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FA40000000000), BinData(128, E09FA7FFFFFFFFFF)]",
								"[BinData(128, E09FB00000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD00000000000), BinData(128, E09FDFFFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5100000000000), BinData(128, E0B51FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B54FFFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B55FFFFFFFFFFF)]",
								"[BinData(128, E0CA8A0000000000), BinData(128, E0CA8AFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAA3FFFFFFFFFF)]",
								"[BinData(128, E0CAA80000000000), BinData(128, E0CAABFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 970,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 54667,
					"restoreState" : 54667,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 710,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 54667,
						"restoreState" : 54667,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F3B0000000000), BinData(128, E09F3BFFFFFFFFFF)]",
								"[BinData(128, E09F3C0000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F700000000000), BinData(128, E09F7FFFFFFFFFFF)]",
								"[BinData(128, E09F800000000000), BinData(128, E09F8FFFFFFFFFFF)]",
								"[BinData(128, E09F900000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FA00000000000), BinData(128, E09FAFFFFFFFFFFF)]",
								"[BinData(128, E09FB00000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5050000000000), BinData(128, E0B505FFFFFFFFFF)]",
								"[BinData(128, E0B5100000000000), BinData(128, E0B51FFFFFFFFFFF)]",
								"[BinData(128, E0B5354000000000), BinData(128, E0B5357FFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CA8FFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAAFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E003FFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 904,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 50111,
					"restoreState" : 50111,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 694,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 50111,
						"restoreState" : 50111,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F2C0000000000), BinData(128, E09F2FFFFFFFFFFF)]",
								"[BinData(128, E09F300000000000), BinData(128, E09F3FFFFFFFFFFF)]",
								"[BinData(128, E09F4B0000000000), BinData(128, E09F4BFFFFFFFFFF)]",
								"[BinData(128, E09F4C0000000000), BinData(128, E09F4FFFFFFFFFFF)]",
								"[BinData(128, E09F600000000000), BinData(128, E09F6FFFFFFFFFFF)]",
								"[BinData(128, E09F700000000000), BinData(128, E09F7FFFFFFFFFFF)]",
								"[BinData(128, E09F800000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B53FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0CA22AA80000000), BinData(128, E0CA22AABFFFFFFF)]",
								"[BinData(128, E0CA280000000000), BinData(128, E0CA2BFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CA8FFFFFFFFFFF)]",
								"[BinData(128, E0CAA00000000000), BinData(128, E0CAAFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E00FFFFFFFFFFF)]",
								"[BinData(128, E0E0200000000000), BinData(128, E0E020FFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 900,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 45556,
					"restoreState" : 45556,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 610,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 45556,
						"restoreState" : 45556,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09DBFFC00000000), BinData(128, E09DBFFFFFFFFFFF)]",
								"[BinData(128, E09DE00000000000), BinData(128, E09DEFFFFFFFFFFF)]",
								"[BinData(128, E09DFA8000000000), BinData(128, E09DFABFFFFFFFFF)]",
								"[BinData(128, E09E700000000000), BinData(128, E09E7FFFFFFFFFFF)]",
								"[BinData(128, E09EC00000000000), BinData(128, E09EFFFFFFFFFFFF)]",
								"[BinData(128, E09F000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B4500000000000), BinData(128, E0B45FFFFFFFFFFF)]",
								"[BinData(128, E0B4700000000000), BinData(128, E0B47FFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B53FFFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B57FFFFFFFFFFF)]",
								"[BinData(128, E0B5800000000000), BinData(128, E0B5BFFFFFFFFFFF)]",
								"[BinData(128, E0B5C00000000000), BinData(128, E0B5FFFFFFFFFFFF)]",
								"[BinData(128, E0CA000000000000), BinData(128, E0CA3FFFFFFFFFFF)]",
								"[BinData(128, E0CA800000000000), BinData(128, E0CABFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E03FFFFFFFFFFF)]",
								"[BinData(128, E0E0800000000000), BinData(128, E0E08FFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 950,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 41000,
					"restoreState" : 41000,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 740,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 41000,
						"restoreState" : 41000,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09CC00000000000), BinData(128, E09CFFFFFFFFFFFF)]",
								"[BinData(128, E09D000000000000), BinData(128, E09DFFFFFFFFFFFF)]",
								"[BinData(128, E09E000000000000), BinData(128, E09EFFFFFFFFFFFF)]",
								"[BinData(128, E09F000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B4000000000000), BinData(128, E0B4FFFFFFFFFFFF)]",
								"[BinData(128, E0B5000000000000), BinData(128, E0B5FFFFFFFFFFFF)]",
								"[BinData(128, E0B6550000000000), BinData(128, E0B655FFFFFFFFFF)]",
								"[BinData(128, E0B7000000000000), BinData(128, E0B70FFFFFFFFFFF)]",
								"[BinData(128, E0B7100000000000), BinData(128, E0B71FFFFFFFFFFF)]",
								"[BinData(128, E0B7400000000000), BinData(128, E0B74FFFFFFFFFFF)]",
								"[BinData(128, E0B7500000000000), BinData(128, E0B75FFFFFFFFFFF)]",
								"[BinData(128, E0C8800000000000), BinData(128, E0C8BFFFFFFFFFFF)]",
								"[BinData(128, E0C8E00000000000), BinData(128, E0C8EFFFFFFFFFFF)]",
								"[BinData(128, E0CA000000000000), BinData(128, E0CAFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E0FFFFFFFFFFFF)]",
								"[BinData(128, E0E2000000000000), BinData(128, E0E23FFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 830,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 36445,
					"restoreState" : 36445,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 570,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 36445,
						"restoreState" : 36445,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E094000000000000), BinData(128, E097FFFFFFFFFFFF)]",
								"[BinData(128, E099000000000000), BinData(128, E099FFFFFFFFFFFF)]",
								"[BinData(128, E09B000000000000), BinData(128, E09BFFFFFFFFFFFF)]",
								"[BinData(128, E09C000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B1000000000000), BinData(128, E0B1FFFFFFFFFFFF)]",
								"[BinData(128, E0B3000000000000), BinData(128, E0B3FFFFFFFFFFFF)]",
								"[BinData(128, E0B4000000000000), BinData(128, E0B7FFFFFFFFFFFF)]",
								"[BinData(128, E0BC400000000000), BinData(128, E0BC7FFFFFFFFFFF)]",
								"[BinData(128, E0BD000000000000), BinData(128, E0BDFFFFFFFFFFFF)]",
								"[BinData(128, E0C2000000000000), BinData(128, E0C2FFFFFFFFFFFF)]",
								"[BinData(128, E0C3A00000000000), BinData(128, E0C3AFFFFFFFFFFF)]",
								"[BinData(128, E0C8000000000000), BinData(128, E0CBFFFFFFFFFFFF)]",
								"[BinData(128, E0CE000000000000), BinData(128, E0CEFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0E3FFFFFFFFFFFF)]",
								"[BinData(128, E0E4000000000000), BinData(128, E0E40FFFFFFFFFFF)]",
								"[BinData(128, E0E8000000000000), BinData(128, E0E8FFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1060,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 31889,
					"restoreState" : 31889,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 780,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 31889,
						"restoreState" : 31889,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E03B000000000000), BinData(128, E03BFFFFFFFFFFFF)]",
								"[BinData(128, E03C000000000000), BinData(128, E03FFFFFFFFFFFFF)]",
								"[BinData(128, E068000000000000), BinData(128, E06BFFFFFFFFFFFF)]",
								"[BinData(128, E087000000000000), BinData(128, E087FFFFFFFFFFFF)]",
								"[BinData(128, E08C000000000000), BinData(128, E08FFFFFFFFFFFFF)]",
								"[BinData(128, E090000000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0A4000000000000), BinData(128, E0A7FFFFFFFFFFFF)]",
								"[BinData(128, E0AD400000000000), BinData(128, E0AD7FFFFFFFFFFF)]",
								"[BinData(128, E0B0000000000000), BinData(128, E0BFFFFFFFFFFFFF)]",
								"[BinData(128, E0C0000000000000), BinData(128, E0CFFFFFFFFFFFFF)]",
								"[BinData(128, E0D8000000000000), BinData(128, E0DBFFFFFFFFFFFF)]",
								"[BinData(128, E0E0000000000000), BinData(128, E0EFFFFFFFFFFFFF)]",
								"[BinData(128, E0F0000000000000), BinData(128, E0F0FFFFFFFFFFFF)]",
								"[BinData(128, E211555540000000), BinData(128, E21155557FFFFFFF)]",
								"[BinData(128, E214000000000000), BinData(128, E217FFFFFFFFFFFF)]",
								"[BinData(128, E240000000000000), BinData(128, E243FFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 926,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 27334,
					"restoreState" : 27334,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 716,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 27334,
						"restoreState" : 27334,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, B57FC00000000000), BinData(128, B57FFFFFFFFFFFFF)]",
								"[BinData(128, B5D0000000000000), BinData(128, B5DFFFFFFFFFFFFF)]",
								"[BinData(128, B5F0000000000000), BinData(128, B5FFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E03FFFFFFFFFFFFF)]",
								"[BinData(128, E040000000000000), BinData(128, E04FFFFFFFFFFFFF)]",
								"[BinData(128, E060000000000000), BinData(128, E06FFFFFFFFFFFFF)]",
								"[BinData(128, E070000000000000), BinData(128, E07FFFFFFFFFFFFF)]",
								"[BinData(128, E080000000000000), BinData(128, E0BFFFFFFFFFFFFF)]",
								"[BinData(128, E0C0000000000000), BinData(128, E0FFFFFFFFFFFFFF)]",
								"[BinData(128, E180000000000000), BinData(128, E18FFFFFFFFFFFFF)]",
								"[BinData(128, E1A0000000000000), BinData(128, E1AFFFFFFFFFFFFF)]",
								"[BinData(128, E200000000000000), BinData(128, E20FFFFFFFFFFFFF)]",
								"[BinData(128, E210000000000000), BinData(128, E21FFFFFFFFFFFFF)]",
								"[BinData(128, E230000000000000), BinData(128, E233FFFFFFFFFFFF)]",
								"[BinData(128, E234000000000000), BinData(128, E237FFFFFFFFFFFF)]",
								"[BinData(128, E240000000000000), BinData(128, E27FFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 840,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 22778,
					"restoreState" : 22778,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 580,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 22778,
						"restoreState" : 22778,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 9FEC000000000000), BinData(128, 9FEFFFFFFFFFFFFF)]",
								"[BinData(128, 9FF0000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, B500000000000000), BinData(128, B5FFFFFFFFFFFFFF)]",
								"[BinData(128, B710000000000000), BinData(128, B71FFFFFFFFFFFFF)]",
								"[BinData(128, B740000000000000), BinData(128, B77FFFFFFFFFFFFF)]",
								"[BinData(128, B7C5000000000000), BinData(128, B7C5FFFFFFFFFFFF)]",
								"[BinData(128, B7D0000000000000), BinData(128, B7DFFFFFFFFFFFFF)]",
								"[BinData(128, CA80000000000000), BinData(128, CABFFFFFFFFFFFFF)]",
								"[BinData(128, CAC0000000000000), BinData(128, CAFFFFFFFFFFFFFF)]",
								"[BinData(128, CB80000000000000), BinData(128, CBBFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E0FFFFFFFFFFFFFF)]",
								"[BinData(128, E100000000000000), BinData(128, E1FFFFFFFFFFFFFF)]",
								"[BinData(128, E200000000000000), BinData(128, E2FFFFFFFFFFFFFF)]",
								"[BinData(128, E300000000000000), BinData(128, E33FFFFFFFFFFFFF)]",
								"[BinData(128, E340000000000000), BinData(128, E343FFFFFFFFFFFF)]",
								"[BinData(128, E380000000000000), BinData(128, E3BFFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1184,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 18223,
					"restoreState" : 18223,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 954,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 18223,
						"restoreState" : 18223,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 9D00000000000000), BinData(128, 9DFFFFFFFFFFFFFF)]",
								"[BinData(128, 9E00000000000000), BinData(128, 9EFFFFFFFFFFFFFF)]",
								"[BinData(128, 9F00000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, B400000000000000), BinData(128, B7FFFFFFFFFFFFFF)]",
								"[BinData(128, BC40000000000000), BinData(128, BC7FFFFFFFFFFFFF)]",
								"[BinData(128, BD00000000000000), BinData(128, BDFFFFFFFFFFFFFF)]",
								"[BinData(128, C800000000000000), BinData(128, CBFFFFFFFFFFFFFF)]",
								"[BinData(128, CE00000000000000), BinData(128, CEFFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, E3FFFFFFFFFFFFFF)]",
								"[BinData(128, E400000000000000), BinData(128, E4FFFFFFFFFFFFFF)]",
								"[BinData(128, E600000000000000), BinData(128, E6FFFFFFFFFFFFFF)]",
								"[BinData(128, E800000000000000), BinData(128, E8FFFFFFFFFFFFFF)]",
								"[BinData(128, E900000000000000), BinData(128, E9FFFFFFFFFFFFFF)]",
								"[BinData(128, EA00000000000000), BinData(128, EA3FFFFFFFFFFFFF)]",
								"[BinData(128, EA40000000000000), BinData(128, EA7FFFFFFFFFFFFF)]",
								"[BinData(128, EC00000000000000), BinData(128, EC3FFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1070,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 13667,
					"restoreState" : 13667,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 740,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 13667,
						"restoreState" : 13667,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 3B00000000000000), BinData(128, 3BFFFFFFFFFFFFFF)]",
								"[BinData(128, 3C00000000000000), BinData(128, 3FFFFFFFFFFFFFFF)]",
								"[BinData(128, 6800000000000000), BinData(128, 6BFFFFFFFFFFFFFF)]",
								"[BinData(128, 6C00000000000000), BinData(128, 6FFFFFFFFFFFFFFF)]",
								"[BinData(128, 8400000000000000), BinData(128, 87FFFFFFFFFFFFFF)]",
								"[BinData(128, 8C00000000000000), BinData(128, 8FFFFFFFFFFFFFFF)]",
								"[BinData(128, 9000000000000000), BinData(128, 9FFFFFFFFFFFFFFF)]",
								"[BinData(128, A400000000000000), BinData(128, A7FFFFFFFFFFFFFF)]",
								"[BinData(128, AC00000000000000), BinData(128, AFFFFFFFFFFFFFFF)]",
								"[BinData(128, B000000000000000), BinData(128, BFFFFFFFFFFFFFFF)]",
								"[BinData(128, C000000000000000), BinData(128, CFFFFFFFFFFFFFFF)]",
								"[BinData(128, D000000000000000), BinData(128, D3FFFFFFFFFFFFFF)]",
								"[BinData(128, D800000000000000), BinData(128, DBFFFFFFFFFFFFFF)]",
								"[BinData(128, DC00000000000000), BinData(128, DFFFFFFFFFFFFFFF)]",
								"[BinData(128, E000000000000000), BinData(128, EFFFFFFFFFFFFFFF)]",
								"[BinData(128, F000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 920,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 9111,
					"restoreState" : 9111,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 630,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 9111,
						"restoreState" : 9111,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 0000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				},
				{
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 870,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 4556,
					"restoreState" : 4556,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 620,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 4556,
						"restoreState" : 4556,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, 0000000000000000), BinData(128, FFFFFFFFFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				}
			]
		}
	},
	"serverInfo" : {
		"host" : "some_host",
		"port" : 27017,
		"version" : "3.0.0-rc11",
		"gitVersion" : "709cafbbb86c994bc153df189ace58a9c2e4145b"
	},
	"ok" : 1
}

Sprint: RPL 1 04/03/15
Participants:

 Description   
Issue Status as of Apr 02, 2015

ISSUE SUMMARY
$nearSphere queries using 2d indexes start from a fixed size of initial search area, which is too large for dense data. This strategy may lead to poor performance in some cases.

In 2.6.x and earlier, 2d indexes used a different initial search strategy, which was not susceptible to this issue.

USER IMPACT
Some $nearSphere queries using 2d indexes may suffer from very poor performance.

WORKAROUNDS
Use 2dsphere indexes for spherical data when possible.

AFFECTED VERSIONS
3.0.0 and 3.0.1

FIX VERSION
The fix is included in the 3.0.2 production release.

Original description

We noticed a performance regression in nearSphere queries when comparing 2.6.5 with 3.0.0-rc11. It looks like in 3.0 returns the entire collection is scanned vs only a few thousand documents in 2.6.5



 Comments   
Comment by Michael Kania [ 14/Apr/15 ]

To not pollute this issue, I created a second bug https://jira.mongodb.org/browse/SERVER-18056

Comment by Michael Kania [ 11/Apr/15 ]

So just querying for coordinates appear to be much better with your patch. However after more testing I noticed that if I include a date range in the query there is a pretty significant performance regression between 2.6 and 3.0. I've attached a second export(2d-regression-date-range.tar.gz) that is the same as the previous export but with an additional _created_at field.

\\ create 2d index and _created_at index
db.test_collection.createIndex({ "location": "2d" })
db.test_collection.createIndex( { "_created_at": 1 } )
db.test_collection.find({ location: { $nearSphere: [ 106.6331, 10.7395 ] }, _created_at: {"$lte" : ISODate("2015-01-23T17:59:44Z"), "$gte" : ISODate("2015-01-23T01:59:44Z")}}).limit(100)

2.6
millis: 81
nscanned: 35252
nscannedObjects: 20345

3.0
executionTimeMillis: 2726
totalKeysExamined: 1037671
totalDocsExamined: 744461

Comment by Githook User [ 27/Mar/15 ]

Author:

{u'username': u'visualzhou', u'name': u'Siyuan Zhou', u'email': u'visualzhou@gmail.com'}

Message: SERVER-17469 Enable density estimator for 2d nearSphere.

(cherry picked from commit 3ee2c5c5c2c4ad0534138d567ccc7b053defff4a)
Branch: v3.0
https://github.com/mongodb/mongo/commit/d9eee3757d06aa5467060438b4ff276d8439d737

Comment by Michael Kania [ 26/Mar/15 ]

Awesome. I'll rerun our benchmarks to verify this works for our use case and get back to you.

Comment by Siyuan Zhou [ 26/Mar/15 ]

Hi, dynamike and asya,

The patch has been pushed to master branch yesterday. It'll be included in dev release 3.1.1 and backported to 3.0.

Thanks,
Siyuan

Comment by Githook User [ 25/Mar/15 ]

Author:

{u'username': u'visualzhou', u'name': u'Siyuan Zhou', u'email': u'visualzhou@gmail.com'}

Message: SERVER-17469 Enable density estimator for 2d nearSphere.
Branch: master
https://github.com/mongodb/mongo/commit/3ee2c5c5c2c4ad0534138d567ccc7b053defff4a

Comment by Siyuan Zhou [ 24/Mar/15 ]

Hi dynamike,

After further investigation into 2d index, we found that nearSphere query with 2d index starts from a fixed size of initial search area, which is too large for dense data. We could improve the performance by estimating density and adjusting the initial search area. The proof of concept shows that the running time drops from 2354 ms to 35 ms for default 2d index. If this turns out to be a valid fix, it'll be scheduled to next 3.1 release and backported to 3.0. The performance is still worse than 2dsphere (35ms vs. 26ms) because of the compensation for map distortion, which is expected. I'll update this issue in next few days.

Thanks,
Siyuan

Comment by Siyuan Zhou [ 23/Mar/15 ]

Background

We integrated 2d index search to the new query framework in SERVER-5800 to leverage all the advantages of new query framework, e.g. large result set, skip, limit and yielding. Also we refactored near search into new query framework in SERVER-9986, so that near search can explore the data progressively.

Problem

$nearSphere query assumes the locations are on the Earth and calculates the distance on a spherical surface, which is different from the assumption of 2d index. $nearSphere query with 2d index is very inefficient, since we have to compensate the map distortion very conservatively. As a result, it scans a broader area and fetches more documents than necessary.

On the heatmap of the first 1K points in your dataset, we can see that the data is pretty dense, which aggravates the problem.

Workaround

2dsphere index is designed for such spherical queries, so using 2dsphere index with tuning will make it much better. The default parameter of 2dsphere index is too coarse for this use case. By specifying finer granularity of index level, 2dsphere index gives a reasonable performance.

The following 2dsphere index is built with two extra parameters. "finestIndexedLevel" : 18 means the edge length of the finest cells is around 35.5 meters. You can consider it as a bucket in normal hashing algorithm for all points in the 35.5m X 35.5m square. {{ "coarsestIndexedLevel": 12 }} means the coarsest cell used to cover a query area is around 2.2 km * 2.2 km. Adding indexed level by one reduces the edge length of corresponding cells by half.

> db.twodscan.ensureIndex({ "location": "2dsphere"}, { finestIndexedLevel: 18, coarsestIndexedLevel: 12 })

They give a reasonable tradeoff between covering calculation and scan performance. Now the query time goes down to 26 ms.

> db.twodscan.find({ location: { $nearSphere: [ 106.6331, 10.7395 ] }}).limit(100).explain(true)
{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "test.twodscan",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"location" : {
				"$nearSphere" : [
					106.6331,
					10.7395
				]
			}
		},
		"winningPlan" : {
			"stage" : "LIMIT",
			"limitAmount" : 0,
			"inputStage" : {
				"stage" : "GEO_NEAR_2DSPHERE",
				"keyPattern" : {
					"location" : "2dsphere"
				},
				"indexName" : "location_2dsphere",
				"inputStages" : [
					{
						"stage" : "FETCH",
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130330\"]",
									"[\"1f202322211303303\", \"1f202322211303303\"]",
									"[\"1f2023222113033031\", \"1f2023222113033032\")",
									"[\"1f2023222113033032\", \"1f2023222113033033\")",
									"[\"1f2023222113033033\", \"1f2023222113033034\")"
								]
							}
						}
					},
					{
						"stage" : "FETCH",
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113032\", \"1f2023222113032\"]",
									"[\"1f20232221130323\", \"1f20232221130323\"]",
									"[\"1f202322211303232\", \"1f202322211303232\"]",
									"[\"1f2023222113032322\", \"1f2023222113032323\")",
									"[\"1f2023222113032323\", \"1f2023222113032324\")",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130330\"]",
									"[\"1f202322211303300\", \"1f202322211303300\"]",
									"[\"1f2023222113033001\", \"1f2023222113033002\")",
									"[\"1f2023222113033002\", \"1f2023222113033003\")",
									"[\"1f202322211303303\", \"1f202322211303304\")"
								]
							}
						}
					},
					{
						"stage" : "FETCH",
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113032\", \"1f2023222113032\"]",
									"[\"1f20232221130320\", \"1f20232221130320\"]",
									"[\"1f202322211303201\", \"1f202322211303201\"]",
									"[\"1f2023222113032011\", \"1f2023222113032012\")",
									"[\"1f2023222113032012\", \"1f2023222113032013\")",
									"[\"1f20232221130323\", \"1f20232221130323\"]",
									"[\"1f202322211303232\", \"1f202322211303233\")",
									"[\"1f202322211303233\", \"1f202322211303234\")",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130331\")",
									"[\"1f20232221130331\", \"1f20232221130331\"]",
									"[\"1f202322211303310\", \"1f202322211303311\")",
									"[\"1f202322211303313\", \"1f202322211303313\"]",
									"[\"1f2023222113033132\", \"1f2023222113033133\")"
								]
							}
						}
					}
				]
			}
		},
		"rejectedPlans" : [ ]
	},
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 100,
		"executionTimeMillis" : 26,
		"totalKeysExamined" : 5119,
		"totalDocsExamined" : 3095,
		"executionStages" : {
			"stage" : "LIMIT",
			"nReturned" : 100,
			"executionTimeMillisEstimate" : 20,
			"works" : 5227,
			"advanced" : 100,
			"needTime" : 5126,
			"needFetch" : 0,
			"saveState" : 40,
			"restoreState" : 40,
			"isEOF" : 1,
			"invalidates" : 0,
			"limitAmount" : 0,
			"inputStage" : {
				"stage" : "GEO_NEAR_2DSPHERE",
				"nReturned" : 100,
				"executionTimeMillisEstimate" : 20,
				"works" : 5226,
				"advanced" : 100,
				"needTime" : 5126,
				"needFetch" : 0,
				"saveState" : 40,
				"restoreState" : 40,
				"isEOF" : 0,
				"invalidates" : 0,
				"keyPattern" : {
					"location" : "2dsphere"
				},
				"indexName" : "location_2dsphere",
				"searchIntervals" : [
					{
						"minDistance" : 0,
						"maxDistance" : 53.25514523978361,
						"maxInclusive" : false
					},
					{
						"minDistance" : 53.25514523978361,
						"maxDistance" : 159.76543571935082,
						"maxInclusive" : false
					}
				],
				"inputStages" : [
					{
						"stage" : "FETCH",
						"nReturned" : 36,
						"executionTimeMillisEstimate" : 0,
						"works" : 70,
						"advanced" : 36,
						"needTime" : 33,
						"needFetch" : 0,
						"saveState" : 40,
						"restoreState" : 40,
						"isEOF" : 1,
						"invalidates" : 0,
						"docsExamined" : 36,
						"alreadyHasObj" : 0,
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"nReturned" : 36,
							"executionTimeMillisEstimate" : 0,
							"works" : 70,
							"advanced" : 36,
							"needTime" : 33,
							"needFetch" : 0,
							"saveState" : 40,
							"restoreState" : 40,
							"isEOF" : 1,
							"invalidates" : 0,
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130330\"]",
									"[\"1f202322211303303\", \"1f202322211303303\"]",
									"[\"1f2023222113033031\", \"1f2023222113033032\")",
									"[\"1f2023222113033032\", \"1f2023222113033033\")",
									"[\"1f2023222113033033\", \"1f2023222113033034\")"
								]
							},
							"keysExamined" : 69,
							"dupsTested" : 0,
							"dupsDropped" : 0,
							"seenInvalidated" : 0,
							"matchTested" : 36
						}
					},
					{
						"stage" : "FETCH",
						"nReturned" : 57,
						"executionTimeMillisEstimate" : 0,
						"works" : 681,
						"advanced" : 57,
						"needTime" : 623,
						"needFetch" : 0,
						"saveState" : 40,
						"restoreState" : 40,
						"isEOF" : 1,
						"invalidates" : 0,
						"docsExamined" : 57,
						"alreadyHasObj" : 0,
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"nReturned" : 57,
							"executionTimeMillisEstimate" : 0,
							"works" : 681,
							"advanced" : 57,
							"needTime" : 623,
							"needFetch" : 0,
							"saveState" : 40,
							"restoreState" : 40,
							"isEOF" : 1,
							"invalidates" : 0,
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113032\", \"1f2023222113032\"]",
									"[\"1f20232221130323\", \"1f20232221130323\"]",
									"[\"1f202322211303232\", \"1f202322211303232\"]",
									"[\"1f2023222113032322\", \"1f2023222113032323\")",
									"[\"1f2023222113032323\", \"1f2023222113032324\")",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130330\"]",
									"[\"1f202322211303300\", \"1f202322211303300\"]",
									"[\"1f2023222113033001\", \"1f2023222113033002\")",
									"[\"1f2023222113033002\", \"1f2023222113033003\")",
									"[\"1f202322211303303\", \"1f202322211303304\")"
								]
							},
							"keysExamined" : 680,
							"dupsTested" : 0,
							"dupsDropped" : 0,
							"seenInvalidated" : 0,
							"matchTested" : 57
						}
					},
					{
						"stage" : "FETCH",
						"nReturned" : 3002,
						"executionTimeMillisEstimate" : 20,
						"works" : 4371,
						"advanced" : 3002,
						"needTime" : 1368,
						"needFetch" : 0,
						"saveState" : 34,
						"restoreState" : 34,
						"isEOF" : 1,
						"invalidates" : 0,
						"docsExamined" : 3002,
						"alreadyHasObj" : 0,
						"inputStage" : {
							"stage" : "IXSCAN",
							"filter" : {
								"TwoDSphereKeyInRegionExpression" : true
							},
							"nReturned" : 3002,
							"executionTimeMillisEstimate" : 20,
							"works" : 4371,
							"advanced" : 3002,
							"needTime" : 1368,
							"needFetch" : 0,
							"saveState" : 34,
							"restoreState" : 34,
							"isEOF" : 1,
							"invalidates" : 0,
							"keyPattern" : {
								"location" : "2dsphere"
							},
							"indexName" : "location_2dsphere",
							"isMultiKey" : false,
							"direction" : "forward",
							"indexBounds" : {
								"location" : [
									"[\"1f202322211303\", \"1f202322211303\"]",
									"[\"1f2023222113032\", \"1f2023222113032\"]",
									"[\"1f20232221130320\", \"1f20232221130320\"]",
									"[\"1f202322211303201\", \"1f202322211303201\"]",
									"[\"1f2023222113032011\", \"1f2023222113032012\")",
									"[\"1f2023222113032012\", \"1f2023222113032013\")",
									"[\"1f20232221130323\", \"1f20232221130323\"]",
									"[\"1f202322211303232\", \"1f202322211303233\")",
									"[\"1f202322211303233\", \"1f202322211303234\")",
									"[\"1f2023222113033\", \"1f2023222113033\"]",
									"[\"1f20232221130330\", \"1f20232221130331\")",
									"[\"1f20232221130331\", \"1f20232221130331\"]",
									"[\"1f202322211303310\", \"1f202322211303311\")",
									"[\"1f202322211303313\", \"1f202322211303313\"]",
									"[\"1f2023222113033132\", \"1f2023222113033133\")"
								]
							},
							"keysExamined" : 4370,
							"dupsTested" : 0,
							"dupsDropped" : 0,
							"seenInvalidated" : 0,
							"matchTested" : 3002
						}
					}
				]
			}
		},
		"allPlansExecution" : [ ]
	},
	"serverInfo" : {
		"host" : "siyuan-ws",
		"port" : 27017,
		"version" : "3.0.0-rc6",
		"gitVersion" : "8dd41ae58040dfa09c633c05ce5752d46402f9c5"
	},
	"ok" : 1
}

Next Steps

1. Generally, the best parameters depend on the data, but current default value is too coarse for dense data. We could change it to a finer level, but the default index level also affects existing 2dsphere indexes, so we have to do index versioning first to isolate its effect on new indexes, if this is necessary.

2. "finestIndexedLevel" and "coarsestIndexedLevel" are not documented intentionally, because tuning them requires a deep understanding of 2dsphere index. We could document them as-is, or change the parameter to approximate finest/coarsest cell edge size, or write up geo tutorials on tuning with examples. Personally, I'd love to gather more real use cases like this one before we make a final decision.

3. It might be possible to use finest level (30) just for inserting points without breaking current behavior. This will not improve data scan but it could reduce the document fetch number. We need more data and profiling to justify this design.

dynamike, thank you very much for pointing out this issue and providing the data. It's really helpful for us to design and benchmark geo features. If you have any questions, feel free to update this ticket.

Thanks,
Siyuan

Comment by Michael Kania [ 23/Mar/15 ]

Any updates? Is this being deferred until 3.1?

Comment by Siyuan Zhou [ 14/Mar/15 ]

dynamike, thanks for sharing your data with us. I am able to reproduce this issue with your data and investigating it. I'll keep you updated.

Comment by Michael Kania [ 14/Mar/15 ]

I've attached a filtered export of the geo data that should highlight this regression.

Reimport by running

mongoimport -d test -c test_collection --jsonArray 2d-regression.json 

Create the 2d index

db.test_collection.createIndex( { "location": "2d" } )

And run the following query against 2.6 and 3.0

db.getCollection("test_collection").find({ location: { $nearSphere: [ 106.6331, 10.7395 ] }}).limit(100)

Comment by Michael Kania [ 13/Mar/15 ]

Below is the explain output for the limited query. I also bumped the version to 3.0.1-rc0.

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "some_collection:Place",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"location" : {
				"$nearSphere" : [
					106.6331,
					10.7395
				]
			}
		},
		"winningPlan" : {
			"stage" : "LIMIT",
			"limitAmount" : 0,
			"inputStage" : {
				"stage" : "GEO_NEAR_2D",
				"keyPattern" : {
					"location" : "2d"
				},
				"indexName" : "location_2d",
				"inputStage" : {
					"stage" : "FETCH",
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F97C000000000), BinData(128, E09F97FFFFFFFFFF)]",
								"[BinData(128, E09F9C0000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FB40000000000), BinData(128, E09FB7FFFFFFFFFF)]",
								"[BinData(128, E09FBC0000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD28000000000), BinData(128, E09FD2BFFFFFFFFF)]",
								"[BinData(128, E09FD2E000000000), BinData(128, E09FD2EFFFFFFFFF)]",
								"[BinData(128, E09FD80000000000), BinData(128, E09FDBFFFFFFFFFF)]",
								"[BinData(128, E09FDE8000000000), BinData(128, E09FDEBFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5150000000000), BinData(128, E0B515FFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B543FFFFFFFFFF)]",
								"[BinData(128, E0B5440000000000), BinData(128, E0B547FFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B550FFFFFFFFFF)]",
								"[BinData(128, E0B5510000000000), BinData(128, E0B5513FFFFFFFFF)]"
							]
						}
					}
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"executionStats" : {
		"executionSuccess" : true,
		"nReturned" : 100,
		"executionTimeMillis" : 2223,
		"totalKeysExamined" : 583104,
		"totalDocsExamined" : 583104,
		"executionStages" : {
			"stage" : "LIMIT",
			"nReturned" : 100,
			"executionTimeMillisEstimate" : 2174,
			"works" : 583207,
			"advanced" : 100,
			"needTime" : 583106,
			"needFetch" : 0,
			"saveState" : 4557,
			"restoreState" : 4557,
			"isEOF" : 1,
			"invalidates" : 0,
			"limitAmount" : 0,
			"inputStage" : {
				"stage" : "GEO_NEAR_2D",
				"nReturned" : 100,
				"executionTimeMillisEstimate" : 2164,
				"works" : 583206,
				"advanced" : 100,
				"needTime" : 583106,
				"needFetch" : 0,
				"saveState" : 4557,
				"restoreState" : 4557,
				"isEOF" : 0,
				"invalidates" : 0,
				"keyPattern" : {
					"location" : "2d"
				},
				"indexName" : "location_2d",
				"searchIntervals" : [ ],
				"inputStage" : {
					"stage" : "FETCH",
					"nReturned" : 583104,
					"executionTimeMillisEstimate" : 1059,
					"works" : 583105,
					"advanced" : 583104,
					"needTime" : 0,
					"needFetch" : 0,
					"saveState" : 4557,
					"restoreState" : 4557,
					"isEOF" : 1,
					"invalidates" : 0,
					"docsExamined" : 583104,
					"alreadyHasObj" : 0,
					"inputStage" : {
						"stage" : "IXSCAN",
						"filter" : {
							"TwoDKeyInRegionExpression" : true
						},
						"nReturned" : 583104,
						"executionTimeMillisEstimate" : 739,
						"works" : 583104,
						"advanced" : 583104,
						"needTime" : 0,
						"needFetch" : 0,
						"saveState" : 4557,
						"restoreState" : 4557,
						"isEOF" : 1,
						"invalidates" : 0,
						"keyPattern" : {
							"location" : "2d"
						},
						"indexName" : "location_2d",
						"isMultiKey" : false,
						"direction" : "forward",
						"indexBounds" : {
							"location" : [
								"[BinData(128, E09F97C000000000), BinData(128, E09F97FFFFFFFFFF)]",
								"[BinData(128, E09F9C0000000000), BinData(128, E09F9FFFFFFFFFFF)]",
								"[BinData(128, E09FB40000000000), BinData(128, E09FB7FFFFFFFFFF)]",
								"[BinData(128, E09FBC0000000000), BinData(128, E09FBFFFFFFFFFFF)]",
								"[BinData(128, E09FC00000000000), BinData(128, E09FCFFFFFFFFFFF)]",
								"[BinData(128, E09FD28000000000), BinData(128, E09FD2BFFFFFFFFF)]",
								"[BinData(128, E09FD2E000000000), BinData(128, E09FD2EFFFFFFFFF)]",
								"[BinData(128, E09FD80000000000), BinData(128, E09FDBFFFFFFFFFF)]",
								"[BinData(128, E09FDE8000000000), BinData(128, E09FDEBFFFFFFFFF)]",
								"[BinData(128, E09FE00000000000), BinData(128, E09FEFFFFFFFFFFF)]",
								"[BinData(128, E09FF00000000000), BinData(128, E09FFFFFFFFFFFFF)]",
								"[BinData(128, E0B5150000000000), BinData(128, E0B515FFFFFFFFFF)]",
								"[BinData(128, E0B5400000000000), BinData(128, E0B543FFFFFFFFFF)]",
								"[BinData(128, E0B5440000000000), BinData(128, E0B547FFFFFFFFFF)]",
								"[BinData(128, E0B5500000000000), BinData(128, E0B550FFFFFFFFFF)]",
								"[BinData(128, E0B5510000000000), BinData(128, E0B5513FFFFFFFFF)]"
							]
						},
						"keysExamined" : 583104,
						"dupsTested" : 0,
						"dupsDropped" : 0,
						"seenInvalidated" : 0,
						"matchTested" : 583104
					}
				}
			}
		},
		"allPlansExecution" : [ ]
	},
	"serverInfo" : {
		"host" : "some_host",
		"port" : 27017,
		"version" : "3.0.1-rc0",
		"gitVersion" : "3f999d764cdd307f779b27e3a28230b21bd43e25"
	},
	"ok" : 1
}

I'll work on getting a filtered dataset to you to help you debug.

Comment by Siyuan Zhou [ 09/Mar/15 ]

Hi dynamike,

We refactored near search in SERVER-9986, so the behavior might be different with previous version, but the result should be the same. Could you please copy and paste the result of find(...).limit(...).explain(true) for the limited query?

I am particular interested in the data distribution. It seems like a bug that each input stage scans and returns all documents. Is there any chance to send the filtered geo data to us, so that we can reproduce this issue?

Also I am wondering if there is any particular reason that 2d index is used instead of 2dsphere index, given that the query is about longitude and latitude. I am wondering if 2dsphere index has the same problem or it would be a workaround for you.

Thanks,
Siyuan

Comment by Michael Kania [ 05/Mar/15 ]

I did try the same query with limit(100)

db.getCollection("some_collection:Place").find({location: { $nearSphere: [ 106.6331, 10.7395 ] }}).limit(100).explain("executionStats")

and totalKeysExamined dropped from 8163456(14x collection size) to 583104(1x collection size). In 2.6.5 nscanned is 3692.

Comment by Siyuan Zhou [ 04/Mar/15 ]

dynamike, thanks for reporting this issue. We removed the default limit of 100 documents for near query with 2d index for consistent semantic. See http://docs.mongodb.org/manual/release-notes/3.0-compatibility/#d-indexes-and-geospatial-near-queries.

For $nearSphere queries that use a 2d index, MongoDB no longer uses a default limit of 100 documents.

You can specify limit() to limit the number of results.

Generated at Thu Feb 08 03:44:34 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.