2014-09-17 14 views
6

2dsphere üzerindeki alan dizinini indeksledim ve Point type GeoJson verilerinde geowithin sorgusunu çalıştıramıyorum.MongoDB: Sorgulaştırılamıyor: BadValue hatalı coğrafi sorgu

db.test.find({ loc : 
        { $geoWithin : 
         { $geometry : 
          { type : "Polygon" , 
          coordinates : [ [ [-74.6862705412253, 40.42341005] , 
               [-75.0846179, 39.9009465 ], 
               [-74.20570119999999, 41.0167639 ] 
              ] 
              ] 
          } 
         } 
         } 
       } 

Çıktı:

uncaught exception: error: { 
"$err" : "Can't canonicalize query: BadValue bad geo query", 
"code" : 17287 
} 

Doküman Yapısı:

  { 
      "_id" : ObjectId("53d15e7132e7b7978c472e6e"), 
      "loc" : { 
        "type" : "Point", 
        "coordinates" : [ -74.6862705412253, 40.42341005 ] 
        }, 

     } 

endeksler:

{ 
"0" : { 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "name" : "_id_", 
    "ns" : "collab.test" 
}, 
"1" : { 
    "v" : 1, 
    "key" : { 
     "loc" : "2dsphere" 
    }, 
    "name" : "TestLocationIndex", 
    "ns" : "collab.test", 
    "2dsphereIndexVersion" : 2 
} 
İşte

sorgu

}

Ancak, Çokgen, aynı belgeler üzerinde iyi çalışır. Geowithin neden çalışmadığını anlamaya çalışıyorum?

cevap

13

Bunun nedeni, poligonunuzun kapalı olmamasıdır, geçerli bir çokgen için minimum dört noktaya gereksiniminiz vardır, ilk nokta en sonunda tekrarlanır, bkz. GeoJSON Polygon docs. Hata mesajı biraz daha yararlı olabilir, söylenmesi gerekiyor. Bu aynı zamanda Well Known Text (WKT) ve İyi Bilinen İkili (WKB) çokgen formatları için de geçerlidir, bu nedenle GeoJSON'un bir özelliği değildir.

Sorgunuz bu gibi çalışması gerekir:

db.test.find({loc : 
       {$geoWithin : 
        {$geometry : 
         {type : "Polygon" , 
          coordinates : [[[-74.6862705412253, 40.42341005] , 
              [-75.0846179, 39.9009465], 
              [-74.20570119999999, 41.0167639], 
              [-74.6862705412253, 40.42341005]]]          
         } 
        } 
       } 
      } 
+0

Çok açıktır. MongoDB uzamsal hataları biraz yararsız olabilir. –