Test data:
db.test.insert({ point: { "type": "MultiPolygon", "coordinates": [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] }, array: [ { value1: 1, value2: 2 }, { value1: 5, value2: 10 } ] })
Test index:
db.test.ensureIndex({'array.value1':1,'array.value2':1,point:"2dsphere"})
Test query:
db.test.find({ point: { $geoWithin: { $geometry: { "type": "MultiPolygon", "coordinates": [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] } } }, array: {$elemMatch:{value1:1, value2:2}} }).hint("array.value1_1_array.value2_1_point_2dsphere").explain()
The explain() output has very bad index bounds, which renders the index useless:
"indexBounds" : { "array.value1" : [ "[MinKey, MaxKey]" ], "array.value2" : [ "[MinKey, MaxKey]" ], "point" : [ "[MinKey, MaxKey]" ] }
If I don't use $elemMatch, the results are a bit better, but array.value2 bounds are not set:
db.test.find({ point: { $geoWithin: { $geometry: { "type": "MultiPolygon", "coordinates": [ [ [[30, 20], [45, 40], [10, 40], [30, 20]] ], [ [[15, 5], [40, 10], [10, 20], [5, 10], [15, 5]] ] ] } } }, 'array.value1':1, 'array.value2':2 }).hint("array.value1_1_array.value2_1_point_2dsphere").explain() .... "indexBounds" : { "array.value1" : [ "[1.0, 1.0]" ], "array.value2" : [ "[MinKey, MaxKey]" ], "point" : [ "[\"0f200\", \"0f201\")", "[\"0f2012\", \"0f2013\")", "[\"0f2013\", \"0f2014\")", "[\"0f202\", \"0f203\")", "[\"0f2030\", \"0f2031\")", "[\"0f2031\", \"0f2032\")", "[\"0f2112333\", \"0f2112334\")", "[\"0f212\", \"0f213\")", "[\"0f2130\", \"0f2131\")", "[\"0f220\", \"0f221\")", "[\"0f221\", \"0f222\")", "[\"0f222\", \"0f223\")", "[\"0f22311\", \"0f22312\")", "[\"0f230\", \"0f231\")", "[\"0f231\", \"0f232\")", "[\"0f232\", \"0f233\")", "[\"2f0000\", \"2f0001\")", "[\"2f0003\", \"2f0004\")", "[\"2f0010\", \"2f0011\")", "[\"2f0011000\", \"2f0011000\"]", "[\"2f00110000\", \"2f00110001\")" ] } ...
- duplicates
-
SERVER-23065 Geo predicate beneath $elemMatch object causes planner to ignore valid index with 2dsphereIndexVersion > 1
-
- Closed
-