Pymongo автосортировка словаря ввода - PullRequest
0 голосов
/ 23 августа 2011

Я использую Pymongo для доступа к Mongo db. Я хочу найти всех людей рядом с указанным местоположением, имя которого содержит строку. Например, я хочу найти всех людей поблизости [105.0133, 21.3434] и имя содержит «Mark». Поэтому я пишу запрос так:

db.users.find({ "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS }, "name": "/Mark/" })

(у меня есть индекс "location.coords" в моей коллекции "users")

Запрос отлично работает в консоли Mongodb, но при выполнении Pymongo словарь пересортируется следующим образом:

{ "name": "/Mark/", "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }

(ключ "name" находится перед "location.coords", это не то, что я ожидал - также ожидал Mongodb)

Это приводит к тому, что Mongodb не может понять запрос и не возвращает результатов. Может кто-нибудь помочь мне разобраться, как заставить Пимонго не пересортировать мой словарь.

Спасибо и всего наилучшего

Ответы [ 2 ]

0 голосов
/ 24 августа 2011

Проблема не в заказе, а в "/Mark/". Обозначения с косой чертой - это удобство, обеспечиваемое оболочкой javascript, и они не являются частью самого шаблона регулярного выражения (если только вы не хотели, чтобы они были буквальными косыми чертами, в этом случае я неправильно понял ваш вопрос).

Чтобы использовать фильтр регулярных выражений («содержит») в PyMongo, вам необходимо передать объект регулярного выражения Python. Попробуйте это:

{ "name": re.compile("Mark"), "location.coords": { "$nearSphere": [105.0133, 21.3434], "$maxDistance": 10/EARTH_RADIUS } }
0 голосов
/ 23 августа 2011

Тип словаря по своей природе беспорядочный. Из документации python :

Лучше всего думать о словаре как о неупорядоченном наборе ключ: значение пары, с требованием, чтобы ключи были уникальными (в течение одного словарь).

Если вы хотите проиндексировать ваш словарь в определенном порядке, вам придется каким-то образом хранить его. Один из простых способов сделать это - сохранить ключи в списке, например:

mongo_keys = ["location.coords", "name"]
for k in mongo_keys:
    do_something(mongo_result[k])

Вы также можете расследовать :

класс collection.OrderedDict ([items])

вернуть экземпляр диктата подкласс, поддерживающий обычные методы dict. OrderedDict является диктатом который помнит порядок, в который ключи были впервые вставлены. Если новая запись перезаписывает существующую запись, исходная позиция вставки остается без изменений. Удаление и повторная вставка записи переместит ее в конец.

К сожалению, если вам нужна дополнительная помощь, вам нужно предоставить более подробную информацию о вашей ситуации.

...