Статьи

Объявление о выпуске PyMongo 2.7

лист

Несколько дней назад мы с Берни Хакеттом отправили кандидата на выпуск PyMongo 2.7 с существенным вкладом Амалии Хокинс и Кайла Эрфа. Эта версия поддерживает новые функции в предстоящей версии MongoDB 2.6 и содержит значительные внутренние улучшения в коде драйвера. Мы редко делаем RC до релизов, но, учитывая масштаб изменений, это кажется разумным.

Установите RC как:

pip install \
  https://github.com/mongodb/mongo-python-driver/archive/2.7rc0.tar.gz

Пожалуйста, сообщите нам, если вы найдете ошибки .

Поддержка MongoDB 2.6

Впервые за многие годы проводной протокол MongoDB меняется. Берни Хакетт обновил PyMongo для поддержки нового протокола, сохраняя обратную совместимость со старыми серверами. Он также добавил поддержку новой parallelCollectionScanкоманды MongoDB , которая сканирует всю коллекцию с несколькими курсорами параллельно .

Амалия Хокинс написала функцию для установки таймаута на стороне сервера для длительных операций с помощью max_time_msметода:

try:
    for doc in collection.find().max_time_ms(1000):
        pass
except ExecutionTimeout:
    print "Aborted after one second."

Она также добавила поддержку нового оператора агрегации $out, который создает коллекцию непосредственно из конвейера агрегации . Пока она занималась этим, она заставляла PyMongo регистрировать предупреждение всякий раз, когда ваши предпочтения чтения «вторичны», но команда должна выполняться на первичном:

>>> client = MongoReplicaSetClient(
...     'localhost',
...     replicaSet='repl0',
...     read_preference=ReadPreference.SECONDARY)
>>> client.db.command({'reIndex': 'collection'})
UserWarning: reindex does not support SECONDARY read preference
and will be routed to the primary instead.
{'ok': 1}

Массовая запись API

Берни добавил API для массовой записи . Теперь можно указать серию вставок, обновлений, вставок, замен и удалений, а затем выполнить их все сразу:

bulk = db.collection.initialize_ordered_bulk_op()
bulk.insert({'_id': 1})
bulk.insert({'_id': 2})
bulk.find({'_id': 1}).update({'$set': {'foo': 'bar'}})
bulk.find({'_id': 3}).remove()
result = bulk.execute()

PyMongo собирает операции в минимальный набор сообщений на сервер. По сравнению со старым стилем, массовые операции имеют более низкую стоимость сети. Вы можете использовать массовый API PyMongo с любой версией MongoDB, но вы получаете сетевое преимущество только при общении с MongoDB 2.6.

Улучшенный код C

После больших усилий я понимаю, почему нашим расширениям C не нравилось работать mod_wsgi. Я написал объяснение более подробное, чем вы хотите прочитать. Но что еще лучше, Берни исправил наш C-код, чтобы mod_wsgiбольше не замедлять его и не записывать странные предупреждения. Наконец, я поместил четкие инструкции по настройке в документы PyMongo.

Берни исправил весь оставшийся платформо-зависимый C-код. Теперь вы можете запустить PyMongo с его расширениями C на ARM, например, если вы общаетесь с MongoDB из Raspberry Pi.

Громовое стадо

Я пересмотрел, MongoClientтак что его управление параллелизмом ближе к тому, что я делал MongoReplicaSetClientв прошлом выпуске . С новым MongoClient сильно многопоточное приложение Python станет намного более устойчивым к сетевым сбоям или сбоям в работе серверов MongoDB. Вы можете прочитать подробности в отчете об ошибке .

GridFS курсор

У нас было несколько запросов функций для запроса GridFS с PyMongo, поэтому Кайл Erf реализовал GridFS курсор:

>>> fs = gridfs.GridFS(client.db)
>>> # Find large files:
...
>>> fs.find({'length': {'$gt': 1024}}).count()
42
>>> # Find files whose names start with "Kyle":
...
>>> pattern = bson.Regex('kyle.*', 'i')
>>> cursor = fs.find({'filename': pattern})
>>> for grid_out_file in cursor:
...     print grid_out_file.filename
...
Kyle
Kyle1
Kyle Erf

Вы можете просмотреть все 53 новые функции и исправления в нашем трекере.

Наслаждайтесь!