исключение: команда geoNear завершилась неудачно: errmsg: более одного двумерного индекса - PullRequest
1 голос
/ 27 апреля 2019

Я пытаюсь получить документы из коллекции на расстоянии.Я пытался использовать агрегацию $geoNear, но я либо сталкиваюсь с ошибками (используя node.js и почтальон), либо возвращается 0 записей.

Образец документа:

{
    "_id" : ObjectId("5cc37692fe9fd54b3cd136c9"),
    "category" : "art",
    "description" : "an eastbound description for The soda event.",
    "geometry" : {
        "type" : "Point",
        "coordinates" : [ 
            3.60178480057443, 
            6.46123057784917
        ]
    }
    "__v" : 0
}
.
.

Модель:

const GeoSchema = new Schema({
  type: {
    type: String,
    default: "Point"
  },
  coordinates: {
    type: [Number],
    index: "2dsphere"
  }
}, { _id: false });

const EventSchema = new Schema({
  category: String,
  description: String,
  geometry: GeoSchema,
});

Запрос

db.events.aggregate([
   {
     $geoNear: {
        near: { type: "Point", coordinates: [3.60178480057443, 6.46123057784917] },
        distanceField: "dist",
        maxDistance: 90000,
        spherical: true
     }
   }
]);

Выполнение вышеуказанного запроса возвращает ноль результатов, пустой массив(на почтальоне) и иногда отображает эту ошибку:

{
    "name": "MongoError",
    "errmsg": "exception: geoNear command failed: { ok: 0.0, errmsg: \"more than one 2d index, not sure which to run geoNear on\" }",
    "code": 16604,
    "ok": 0
}

Когда отображается эта ошибка, я запускаю функцию db.events.dropIndex.Я скопировал и вставил примеры, используемые в документах, и это работало нормально.Пожалуйста, Как мне заставить эту функцию $ geoNear работать.Я боролся с этим целый день.

1 Ответ

1 голос
/ 27 апреля 2019

В одной коллекции не может быть более одного индекса 2dsphere, и вы создали индекс 2dsphere для нескольких полей, выполнив следующую команду.

db.getCollection('test').createIndex({ "loc": "2dsphere" }) 

Так что удалите один из индекса, и он получит работу.Вы можете проверить список индексов, используя это

db.getCollection('test').getIndexes()

Обновление:

Вы можете использовать keyпараметр, чтобы указать, по какому полю вы хотите выполнить поиск, если ваша коллекция имеет несколько $geoNear индексов

...