Что не так с геопространственными запросами с использованием полигонов и Мангуста?

#mongodb #geospatial #mongoose

#mongodb #геопространственные #mongoose

Вопрос:

Я выполняю геопространственный запрос с помощью $polygon поиска. Мой запрос:

 {
    'location_latLong': {
        '$within': {
            '$polygon': {
                point1: {
                    lon: '-74.2621',
                    lat: '40.5788'
                },
                point2: {
                    lon: '-74.2621',
                    lat: '40.8494'
                },
                point3: {
                    lon: '-73.7499',
                    lat: '40.8494'
                },
                point4: {
                    lon: '-73.7499',
                    lat: '40.5788'
                }
            }
        }
    }
}
  

В моей коллекции у меня есть документ, который ЯВНО находится внутри полигона:

 {
    "_id": ObjectId("4e95c285cb8a0efc2b00001a"),
    "addedOn": Date(1318437509839),
    "checkinDate": Date(1318392000000),
    "checkinTime": Date(1318437476000),
    "location_city": "New York",
    "location_country": "United States",
    "location_latLong": {
        "xLon": -74.007124,
        "yLat": 40.71455
    },
    "location_source": "personprofile",
    "location_state": "New York",
    "location_zip": ""
}
  

и у меня есть 2d индекс location_latLong . Я знаю, что MongoDB игнорирует имена ключей (предположительно), так что это не должно иметь значения. Итак, почему это возвращает 0 результатов?

РЕДАКТИРОВАТЬ Я просто запустил explain , как рекомендовано в комментариях, и я получаю:

 {
    "cursor" : "GeoBrowse-polygon",
    "nscanned" : 0,
    "nscannedObjects" : 0,
    "n" : 0,
    "millis" : 0,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : false,
    "indexOnly" : false,
    "indexBounds" : {
        "location_latLong" : [
            [
                [
                    0,
                    0
                ],
                [
                    0.000021457672119140625,
                    0.000021457672119140625
                ]
            ],
            [
                [
                    -0.000021457672119140625,
                    -0.000021457672119140625
                ],
                [
                    0,
                    0
                ]
            ],
            [
                [
                    -0.000021457672119140625,
                    0
                ],
                [
                    0,
                    0.000021457672119140625
                ]
            ],
            [
                [
                    0,
                    -0.000021457672119140625
                ],
                [
                    0.000021457672119140625,
                    0
                ]
            ]
        ]
    },
    "keysChecked" : NumberLong(8),
    "lookedAt" : NumberLong(4),
    "matchesPerfd" : NumberLong(0),
    "objectsLoaded" : NumberLong(0),
    "pointsLoaded" : NumberLong(0)
}
  

Комментарии:

1. этот запрос выглядит хорошо, я не знаю точной проблемы.. Вы получили сообщение об ошибке? вы указали минимальные / максимальные границы в индексе..

2. Я не указывал минимальные / максимальные границы в индексе, как это должно быть -180 .. 180 по умолчанию, нет?

3. Можете ли вы удалить mongoose из уравнения и запустить его из оболочки с помощью a .explain() ? Это может прояснить, что происходит

4. @GatesVP Я добавил explain , как вы предложили

Ответ №1:

Я решил проблему. Я передавал строки, и я должен был передавать числа с плавающей запятой.

Спасибо за ваше время =)