GeoJSON и MongoDB: стоит ли хранить точки как GeoJSON.Смысл?

введение 2.3 > MongoDB стал еще более полезным с обработкой данных о местоположении и запросами. MongoDB хранит документы как BSON, поэтому каждый документ имеет все поля документа, что, очевидно, потенциально приводит к большим базам данных, чем наши обычные RMDBS.

я использовал для хранения полилиний и полигонов как ряд индексированных точек, с дополнительным полем, представляющим порядок каждой строки (я делал это для обеспечения согласованности при использовании JavaScript, поэтому точки не всегда сохранялись в правильном порядке). Это было что-то вроде:--19-->

polyline: {
  [
    point: [0,0],
    order: 0
  ],
  [
    point: [0,1],
    order: 1
  ]
}

тогда как теперь я использую:

polyline: {
  type: 'LineString',
  coordinates: [
    [0,0],
    [1,0]
  ]
}

я видел улучшение в размере документов, так как некоторые полилинии могут иметь до 500 пунктов.

однако мне интересно, Какие преимущества хранения всех моих Point данные GeoJSON будет. Меня обескураживает увеличение размера документа, например:

loc: [1,0]

это лучше, чем

loc: {
  type: 'Point',
  coordinates: [0,1]
}

и таким образом будет легче работать.

мой вопрос:

лучше / рекомендуется хранить точки как GeoJSON объекты в отличие от массива из 2 точек?

я рассмотрел следующее:

  • ограничения по размеру: у меня потенциально могут быть миллионы документов с местоположением, что может повлиять на размер коллекции, и потенциально мой карман.
  • согласованность: было бы лучше иметь дело с каждым набором координат в в отличие от прилипания к lat, lng для точек, и первый для всех моих других функций местоположения.
  • удобство: если я хватаю точку и использую $geoWithin или $geoIntersects С ним мне не нужно будет сначала конвертировать его в GeoJSON, прежде чем использовать его как

3 ответов


Я бы рекомендовал использовать новый формат GeoJSON. Хотя я не считаю, что было сделано какое-либо объявление о прекращении поддержки старого формата, тот факт, что они ссылаются на него как на наследие, должен быть свидетельством их мнения.

есть некоторые преимущества индексирования для использования 2dsphere, а не 2d.

  • во-первых, он фактически вычисляет запросы, основанные на том, что Земля является сферой. Одним из недостатков 2d-индекса является то, что он не учитывает это означает, что вам придется обрабатывать преобразование самостоятельно, если вас интересует фактическая область, охватываемая запросом, а не базовая lat/lngs.
  • возможность использовать составные индексы, если вы хотите сделать что-то вроде "сначала получите 100 результатов из этой области", то 2dsphere-ваш единственный выбор.
  • возможность использования запросов geoIntersects.
  • геометрические запросы geoWithin требуют, чтобы вы использовали geoJSON формат.

еще одна важная вещь, чтобы отметить, что вы должны быть уверены, что запрос, который вы используете, поддерживается индексом, который вы используете. Например, если вы используете 2dsphere, вы не можете использовать запрос $box, поскольку он не будет индексироваться-однако монго не предупредит - результат будет просто выполнить сканирование таблицы будет очень медленно!

Mongo предоставляет диаграмму совместимости, запросы которой могут использоваться с индексом


Да, я думаю, что это стоит. Исходя из моего опыта работы с геопространственной информационной системой, было бы лучше хранить ваши данные о местоположении в полезном и переносимом стандарте. GeoJSON в MongoDB поддерживает от WGS84 стандарт datum.

в MongoDB $возле оператор может искать по старым 2d координатам и координатам GeoJSON. В устаревшей коллекции 2d-координат $near возвращает ближайшую первую отсортированную коллекцию. $geoNear возвращает a ближайшая первая отсортированная коллекция с расстоянием от искомой точки метаданных.

еще одним преимуществом является возможность использовать другие геопространственные запросы (i.e $geoWithin и $geoIntersect) особенно, если вы храните другие типы GeoJSON (Полилиния, Полигон)

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

Я надеюсь, что эта информация дает вам некоторые мысли о том, что делать с вашими данными о местоположении.


если вы только сохранение геометрии в вашей базе данных, но вы хотите поддерживать несколько разных запросы GeoJSON, который на этих данных, а затем обратите внимание, что можно хранить точки в устаревшем формате пары координат и использовать .

на заметки для мангуста поддержка GeoJSON (MongoDB >= 2.4) приводят следующий пример:

на наследство пары координат:

new Schema({ 
    loc: { type: [Number], index: '2dsphere'}
});

GeoJSON запрос на устаревшие пары координат, используя :

var geojsonPoly = { 
    type: 'Polygon', 
    coordinates: [[[-5,-5], ['-5',5], [5,5], [5,-5],[-5,'-5']]] 
};

Model.find({ loc: { $within: { $geometry: geojsonPoly }}});