|
Behavior of $near with a 2d index and a GeoJSON point has some surprises:
> db.test.createIndex({loc:'2d'});
|
> db.test.insert({_id: 1, loc:[0, 0]});
|
> // point [1, 0] is farther than 0 units from origin as expected
|
> printjson(db.test.findOne({
|
... loc:{
|
... $near:[1, 0],
|
... $maxDistance: 0}}));
|
null
|
> // but GeoJSON point [1, 0] is 0 units from origin??
|
> printjson(db.test.findOne({
|
... loc:{
|
... $near:{
|
... $geometry:{
|
... type:'Point',
|
... coordinates:[1, 0]}},
|
... $maxDistance: 0}}));
|
{ "_id" : 1, "loc" : [ 0, 0 ] }
|
> // Wrong sort order:
|
> db.test.insert({_id: 2, loc:[1, 0]});
|
> db.test.find({
|
... loc:{
|
... $near:{
|
... $geometry:{
|
... type:'Point',
|
... coordinates:[2, 0]}}}});
|
{ "_id" : 1, "loc" : [ 0, 0 ] }
|
{ "_id" : 2, "loc" : [ 1, 0 ] }
|
> // GeoJSON point [2, 0] is 1 unit from [1, 0], but 0 units from origin?
|
> db.test.find({
|
... loc:{
|
... $near:{
|
... $geometry:{
|
... type:'Point',
|
... coordinates:[2, 0]}},
|
... $maxDistance: 1}});
|
{ "_id" : 1, "loc" : [ 0, 0 ] }
|
{ "_id" : 2, "loc" : [ 1, 0 ] }
|
>
|
> db.test.find({
|
... loc:{
|
... $near:{
|
... $geometry:{
|
... type:'Point',
|
... coordinates:[2, 0]}},
|
... $maxDistance:.999}});
|
{ "_id" : 1, "loc" : [ 0, 0 ] }
|
The documentation says "for GeoJSON points, use a 2dsphere index": should we uassert that GeoJSON points aren't used with 2d index, or fix the behavior?
|