Геопространственное индексирование сначала простым ключом - PullRequest
3 голосов
/ 02 ноября 2011

После прочтения о MongoDB и Geospatial Indexing

Я был поражен, что он не поддерживает составные ключи, не начинающиеся с 2d индекса.

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

SELECT TOP 30 * FROM Villages WHERE SID = 10 ORDER BY (math to calc radius from the center point)

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

Так что в Mongo я хотел создать такой индекс, как: {sid: 1, loc: "2d"}, чтобы я мог отфильтровать много с самого начала.

Я не уверен, что естьлюбые решения для этого.Я думал о создании коллекции для каждого sid, поскольку они не делятся информацией.Но каковы недостатки этого?Или люди так делают?

Обновление

Карты плоские: 800, 800 до -800, -800, деревни - это места от центракарта и выход.Существует около 300 различных карт, которые не связаны между собой, поэтому они могут быть в разных коллекциях, но не уверены в накладных расходах.

Если требуется дополнительная информация, пожалуйста, дайте мне знать.

Что я пробовал

> var res = db.Villages.find({sid: 464})
> db.Villages.find({loc: {$near: [50, 50]}, sid: {$in: res}})
error: { "$err" : "invalid query", "code" : 12580 }
>

Также пробовал это

db.Villages.find({loc: {$near: [50, 50]}, sid: {$in: db.Villages.find({sid: 464}, {sid: 1})}})
error: { "$err" : "invalid query", "code" : 12580 }

Я не совсем уверен, что я делаю неправильно, но это, вероятно, что-то в синтаксисе,Запутался здесь.

1 Ответ

2 голосов
/ 03 ноября 2011

Как вы уже сказали, Mongodb не может принять местоположение в качестве вторичного ключа в геоиндексе. 2d должен быть первым в индексе. Так что вам здесь не повезло в изменении шаблонов индексации здесь.

Но есть обходной путь, вместо составного геоиндекса вы можете создать два отдельных индекса для sid и один составной индекс с помощью loc и sid

  db.your_collection.ensureIndex({sid : 1})
  db.your_collection.ensureIndex({loc : '2d',sid:1})

или два отдельных индекса по sid и loc

  db.your_collection.ensureIndex({sid : 1})
  db.your_collection.ensureIndex({loc : '2d'})

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

и вы можете сделать два разных запроса, чтобы сначала отфильтровать результаты по sid, а затем по расположению, вроде как

  res = db.your_collection.find({sid:10})
  //get all the ids from the res (res_ids)
  //and query by location using the ids
  db.your_collection.find({loc:{ $near : [50,50] } ,sid : {$in : res_ids}})  
...