Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-9484

2dsphere Index may not return all documents for $near and geoNear

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Fixed
    • Affects Version/s: 2.4.3
    • Fix Version/s: 2.4.4, 2.5.0
    • Component/s: Geo, Indexing
    • Labels:
      None
    • Environment:
      Windows 7 x64
    • Operating System:
      ALL
    • Steps To Reproduce:
      Hide

      Import data file (attached) into MongoDB using mongoImport to database "sparcTest" and collection "TirCSV". Ensure 2dsphere index on "geometry" field.
      Perform .count() on a global find. Note it returns 3063 elements.
      Perform $geoNear query above and note it misses some data. Record number of elements returned.
      Perform $within query above and note it returns all data.
      Reindex TirCSV collection.
      Perform $geoNear query and record number of elements returned – may be different.
      Perform $geoWithin query and note it still returns all data.

      Show
      Import data file (attached) into MongoDB using mongoImport to database "sparcTest" and collection "TirCSV". Ensure 2dsphere index on "geometry" field. Perform .count() on a global find. Note it returns 3063 elements. Perform $geoNear query above and note it misses some data. Record number of elements returned. Perform $within query above and note it returns all data. Reindex TirCSV collection. Perform $geoNear query and record number of elements returned – may be different. Perform $geoWithin query and note it still returns all data.

      Description

      When performing a $near or geoNear query on GeoJSON data indexed with a 2dsphere index, the query appears to miss data. This may be an issue with the 2dsphere index, as reindexing changes the number of data elements returned for a geoNear query, but not for a bounding-box $geoWithin query. In this case, all of the data is within the polygon bounded by longitude -90 to -80, and latitude 35 to 45. The only secondary index on the collection is

      {"geometry" : "2dsphere"}

      .

      > db.TirCSV.count({ "geometry" : { "$near" : { "$geometry" :

      { "type" : "Point", "coordinates" : [ -85.389 , 40.46]}

      }} , "$or" : [

      { "data_type" : "tir"}

      ]})
      3017
      > db.TirCSV.find({geometry : {$geoWithin : {$geometry : {type : "Polygon", coordinates: [[[-90,45],[-90,35],[-80,35],[-80,45],[-90,45]]]}}}}).count()
      3063
      > db.TirCSV.count(

      {"data_type" : "tir"}

      )
      3063
      > db.TirCSV.reIndex()
      {
      "nIndexesWas" : 2,
      "msg" : "indexes dropped for collection",
      "nIndexes" : 2,
      "indexes" : [
      {
      "key" :

      { "_id" : 1 }

      ,
      "ns" : "sparcTest.TirCSV",
      "name" : "id"
      },
      {
      "key" :

      { "geometry" : "2dsphere" }

      ,
      "ns" : "sparcTest.TirCSV",
      "name" : "geometry_2dsphere"
      }
      ],
      "ok" : 1
      }
      > db.TirCSV.count({ "geometry" : { "$near" : { "$geometry" :

      { "type" : "Point", "coordinates" : [ -85.389 , 40.46]}

      }} , "$or" : [

      { "data_type" : "tir"}

      ]})
      3016
      > db.TirCSV.find({geometry : {$geoWithin : {$geometry : {type : "Polygon", coordinates: [[[-90,45],[-90,35],[-80,35],[-80,45],[-90,45]]]}}}}).count()
      3063

        Attachments

        1. diffs.zip
          15 kB
        2. geoIntersects.kml
          986 kB
        3. near.kml
          974 kB
        4. out.json
          2.56 MB
        5. QueryDiff.js
          2 kB

          Activity

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              5 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: