Можно ли запросить диапазон хэшей хешированного индексированного ключа в mongodb?

У меня включен хешированный сегмент для ключа «userId» в коллекции mongodb. Можно ли получить все документы, чьи хешированные значения «userId» находятся между, скажем, «abcd» и «cdef»?

Спасибо!


person Vyacheslav    schedule 18.07.2013    source источник
comment
Что, вы имеете в виду вернуть внутреннее значение хеш-функции в результате?   -  person Sammaye    schedule 18.07.2013
comment
Не обязательно (но было бы любопытно узнать, как это сделать). Меня интересует следующее: предположим, у меня есть диапазон хэш-сумм MD5: от A до B. Я хочу получить все документы в моей коллекции, чье хэш-значение ключа сегментирования принадлежит этому диапазону   -  person Vyacheslav    schedule 18.07.2013
comment
то есть, если документ A хешируется до хэша 1, B до 2, C до 4, и у меня есть диапазон [0,3], я хочу получить документы A и B   -  person Vyacheslav    schedule 18.07.2013


Ответы (1)


Один из способов, который я нашел, - использовать следующий запрос:

db.mycollection.find({
"$and": [
  {_id: {"$gt": -5012941854059245285}}, 
  {_id : {"$lt": -4712634714892678072}}
]}).hint({_id: "hashed"})

где длинные числа — это хешированные значения _id. Это работает для меня, но это лучший способ сделать это? Могу ли я быть уверен, что он будет работать с предстоящими выпусками mongodb?

person Vyacheslav    schedule 18.07.2013
comment
Вам не нужен $and и вам, вероятно, не нужна подсказка, но да, это выглядит правильно, вы можете просто сделать db.mycollection.find({_id:{$gt:(),$lt:()}}) - person Sammaye; 19.07.2013
comment
Спасибо. Вы правы, мне не нужен $and. Но без подсказки $ я не получаю никаких результатов. Я подозреваю, что срабатывает индекс по умолчанию для _id. На самом деле, объяснение() подтверждает гипотезу. Мне интересно, не является ли использование hint() хакерским решением и будет ли оно переносимым и будет работать для будущих выпусков. - person Vyacheslav; 19.07.2013
comment
Ах, да, индекс по умолчанию может взять верх, странно, интересно, должна ли для этого быть JIRA. Подсказка всегда будет поддерживаться, но это усложняет вашу жизнь как разработчика, когда вам приходится возвращаться и изменять эти запросы, если вы можете справиться с этим, тогда все в порядке. - person Sammaye; 19.07.2013
comment
На самом деле я бы предпочел решение без подсказки (), так как я обеспокоен тем, что оптимизатор запросов может не учитывать эту подсказку в будущем... - person Vyacheslav; 19.07.2013
comment
Это решение использует неподдерживаемое поведение и не работает с MongoDB 2.6. Инструкции по созданию см. ниже: jira.mongodb.org/browse/SERVER-14557< /а> - person James Wahlin; 19.07.2014