Подтвердить что ты не робот

MongoDB 'не может найти индекс для $geoNear query'

Я просто пытаюсь получить простой запрос near. Вот образец моего документа.

{"point": 
  {"type": "Point", 
     "coordinates": [30.443902444762696, -84.27326978424058]}, 
   "created_on": {"$date": 1398016710168}, 
   "radius": 180, 
   "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
   "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
   "expires_on": {"$date": 1399831110168}
}

и с mongod я попробовал команду:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});

но я получаю эту ошибку:

error: {          "$ err": "Невозможно выполнить запрос: запрос обработки ошибок: ns = foo.bar skip = 0\nTree: GEONEAR field = point maxdist = 1.79769e + 308 isNearSphere = 0 || Сначала: notFirst: полный путь: точка \nSort: {}\nПроект: {}\n Ошибка планировщика: не удалось найти индекс для $geoNear query",          "код": 17007     }

Возможно, мой google fu сегодня не такой уж острый, но я ничего не мог найти. Кроме того, я запустил команду index. Мое намерение состоит в том, что это местоположение карты.

db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
4b9b3361

Ответ 1

Несколько проблем, , вы создали свои индексы в коллекции foo базы данных foo, но запрашиваете коллекцию панелей. Вы должны быть в правильной коллекции.

Считывая документ, который вы вставили, вам нужно добавить индекс "2dsphere" в поддерживать объекты geoJson. Этот индекс должен находиться в элементе "point" ваших документов, поэтому попробуйте

db.bar.createIndex({point:"2dsphere"});

Затем вы можете запросить следующее, предоставив объект geoJson obj для запроса:

db.bar.find(
   { point :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [-84.27326978424058, 30.443902444762696] },
            $maxDistance : 1
          }
       }
    }
)

Ответ 2

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

Это решение для той же проблемы для меня.

Где prod - мое имя коллекции, а location - это имя столбца, в котором хранится геопозиция (GeoPoint)

Некоторое обсуждение о том же можно найти здесь

Ответ 3

Таким образом, здесь может быть несколько ошибок:

  • Из данных, которые вы показываете, а также вашей информации о запросах, соответствующая информация содержится в полевой точке и в формате GeoJSON. Создание вашего индекса:
db.foo.createIndex({geo: "2d"})

Не "сбой", потому что в настоящее время это не поле "geo", и поле с данными должно быть в этом месте. Если бы вы использовали "точку" вместо этого, это правильное поле, вы получили бы сообщение об ошибке, указывающей, что этот тип индекса недействителен для данных GeoJSON. Вам нужен индекс "2dsphere":

db.points.createIndex({ "point": "2dsphere" })
  • Расширение той же проблемы, опять же данные в формате GeoJSON, и форма запроса заключается в том, что для старой пары координат. Вам нужно изменить аргументы запроса, чтобы больше не работать:
db.points.find({point: {
    $near: {
        $geometry:{ 
            type: "Point", 
            coordinates: [-84.26060492426588, 30.45023887165371]
        }
    }
}})

Смотрите документацию для $near

Ответ 4

В дополнение к вышеприведенным ответам, если вы уже пытались создать индекс и получили неправильный синтаксис или поле, вы можете запустить

db.<yourcollection>.dropIndexes(); Чтобы очистить все индексы и правильно их воссоздать.

Кроме того, индекс должен быть создан на родительском "координатах", а не на самих координатах:

{
   "_id": 59ac03d168eaaa14c2a57a00",
   "location":{
      "type":"Point",
      "coordinates":[
         131.6667,
         57.8368
      ]
   },
   "age":53,
   "username":"Brandi_Greenfelder"
}

db.<yourcollection>.createIndex({ location: '2dsphere' });

Внимание, есть "2d" и "2dsphere", используйте вторую, как новую вещь.