2016-06-14 3 views
1

Я использую mongoDB, чтобы хранить коллекцию полигонов и использовать $geoIntersects запросов, чтобы найти в каком полигоне определенную точку.MongoDB коллекция кеша в памяти?

Мои mongooseSchema выглядит следующим образом:

var LocationShema = mongoose.Schema({ 
    name: String, 
    geo: { 
     type: { 
      type: String 
     }, 
     coordinates: [] 
    } 
}); 

LocationShema.index({geo: '2dsphere'}); 

module.exports = mongoose.model('Location', LocationShema); 

Таким образом, каждый элемент представляет собой многоугольник. Я добавил индекс 2dsphere, надеясь, что запросы будут быстрее, и вся коллекция будет сохранена в памяти. К сожалению, это занимает около 600ms для ~ 20 запросов, что слишком много для моего использования.

Мои запросы выглядеть следующим образом:

Location.find({ 
      geo: { 
       $geoIntersects: { 
        $geometry: { 
         type: 'Point', 
         coordinates: [pos.lng, pos.lat] 
        } 
       } 
      } 
},...) 

Есть в любом случае я могу сделать это работать быстрее? Могу ли я заставить MongoDB кэшировать всю коллекцию в базе данных (поскольку коллекция ther никогда не изменяется). Есть ли способ, которым я могу проверить, действительно ли коллекция хранится в кеше в памяти?

Кроме того, есть ли какие-либо альтернативы, которые я могу использовать (например: библиотека или что-то еще), что позволяет выполнять быстрые геопространственные запросы?

+1

Можете ли вы опубликовать 'explain()' вашего запроса? – KRONWALLED

+0

при выполнении запроса в оболочке mongo использовать 'db.collectionName.find (query) .explain()' – profesor79

+0

Хм, но я использую 'mongoose' и не использую оболочку, я попробую это, спасибо. – Cristy

ответ

1

С помощью mongo> 3.0 вы можете использовать память inMemory, так что вы можете иметь экземпляр mongo, когда посевная коллекция остается в памяти (все изменения не сохраняются).

С другой стороны, если ваша коллекция статична - может существовать способ реализовать хранилище кеша, такое как Redis, или даже TTL-индексированная коллекция с сохраненным запросом и ответом.

процесс посева может быть выполнен путем резервного копирования текущей коллекции и восстановления в коллекции памяти.

При частом запросе коллекции - это остатки в памяти, пока монго нужно загружать другие коллекции (в занятой системе).

Любые комментарии приветствуются!

+0

Итак, могу ли я использовать хранилище 'inMemory' только для этой коллекции? Как я «семя» коллекции? – Cristy

+1

Я ожидал бы, что после запуска запросов, когда соответствующие дисковые блоки будут присутствовать в дисковых буферах ОС (при условии наличия достаточного объема памяти). – robertklep

+0

@robertklep pls просмотреть изменения – profesor79

Смежные вопросы