Основное руководство пользователя PyMongo

база данных Python сервер MongoDB

pymongo — это библиотека для управления MongoDB в Python. MongoDB — это база данных, основанная на распределенном хранилище файлов, и ее формат хранения файлов похож на JSON, который называется BSON.

Подключиться к базе данных

Первым шагом в использовании pymongo является созданиеMongoClientдля запуска экземпляра mongodb

from pymongo import MongoClient
Client = MongoClient()

получить базу данных

Экземпляр MongoDB может поддерживать несколько независимых баз данных. При использовании PyMongo вы можете использовать свойства экземпляра MongoClient для доступа к базе данных или использовать словарь для доступа.

db = client.test_database
db = client['test-database']

ПолучитьКоллекцию

Коллекция — это набор документов, хранящихся в MongoDB, и ее можно рассматривать примерно как эквивалент таблицы в реляционной базе данных. Получение коллекции в PyMongo работает так же, как получение базы данных:

collection = db.test_collection
collection = db['test-collection']

Коллекции в MongoDB создаются лениво, указанная выше команда не выполняет никаких операций на сервере MongoDB, коллекции и данные создаются при вставке первого документа.

documents

MongoDB использует документы в стиле JSON для представления (и хранения) данных, а в pymongo для представления документов используются словари:

post = {
    "author": "Mike",
    "text": "My first blog post!",
    "tags": ["mongodb", "python", "pymongo"],
    "date": datetime.datetime.utcnow()
}

Вставить документ

использоватьinsert_one()метод вставляет документ в коллекцию

>>> db.test.count({'x': 1})
0
>>> result = db.test.insert_one({'x': 1})
>>> result.inserted_id
ObjectId('54f112defba522406c9cc208')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f112defba522406c9cc208')}

использоватьinsert_many()Способ вставки нескольких документов в коллекцию

>>> db.test.count()
0
>>> result = db.test.insert_many([{'x': i} for i in range(2)])
>>> result.inserted_ids
[ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')]
>>> db.test.count()
2

обновить документацию

использоватьreplace_one()Способ замены документа в Коллекции

>>> for doc in db.test.find({}):
...     print(doc)
...
{u'x': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
>>> result = db.test.replace_one({'x': 1}, {'y': 1})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find({}):
...     print(doc)
...
{u'y': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}

Если соответствующий документ не существует, новый документ можно вставить с помощью опции upsert:

>>> result = db.test.replace_one({'x': 1}, {'x': 1}, True)
>>> result.matched_count
0
>>> result.modified_count
0
>>> result.upserted_id
ObjectId('54f11e5c8891e756a6e1abd4')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f11e5c8891e756a6e1abd4')}

использоватьupdate_one()Способ обновления документа в коллекции

>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_one({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}

использоватьupdate_many()Метод обновления нескольких документов в коллекции

>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_many({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
3
>>> result.modified_count
3
>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 4, u'_id': 1}
{u'x': 4, u'_id': 2}

удалить документ

использоватьdelete_one()Метод удаления документа в коллекции

>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_one({'x': 1})
>>> result.deleted_count
1
>>> db.test.count({'x': 1})
2

использоватьdelete_many()Способ удаления нескольких документов в коллекции

>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_many({'x': 1})
>>> result.deleted_count
3
>>> db.test.count({'x': 1})
0

документ запроса

find()

db.test.find({"hello": "world"})

Сопоставляет только документы с ключевым словом «привет» со значением «мир». Вызывает TypeError, если какой-либо аргумент имеет неправильный тип. Возвращает экземпляр Cursor, соответствующий этому запросу.

find_one()

Запросить один документ

find_one_and_delete()Запросите один документ и удалите его, вернув документ.

>>> db.test.count({'x': 1})
2
>>> db.test.find_one_and_delete({'x': 1})
{u'x': 1, u'_id': ObjectId('54f4e12bfba5220aa4d6dee8')}
>>> db.test.count({'x': 1})
1

Если есть несколько результатов запроса, вы можете использовать сортировку, чтобы удалить первый результат после сортировки.

>>> for doc in db.test.find({'x': 1}):
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_delete(
...     {'x': 1}, sort=[('_id', pymongo.DESCENDING)])
{u'x': 1, u'_id': 2}

find_one_and_replace()

Запросить один документ и заменить. Возвращает исходный документ или замененный документ.find_one_and_replace()метод сfind_one_and_update()Подход другой, просто замена документов, соответствующих фильтру, вместо изменения существующих.

>>> for doc in db.test.find({}):
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_replace({'x': 1}, {'y': 1})
{u'x': 1, u'_id': 0}
>>> for doc in db.test.find({}):
...     print(doc)
...
{u'y': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}

find_one_and_update()

Найдите один документ и обновите его, вернув исходный документ или обновленный документ.

>>> db.test.find_one_and_update(
...    {'_id': 665}, {'$inc': {'count': 1}, '$set': {'done': True}})
{u'_id': 665, u'done': False, u'count': 25}}

по умолчанию,find_one_and_update()Возвращает документ до обновления. Чтобы вернуть документ после обновления, установитеreturn_docuemntпараметр.

>>> from pymongo import ReturnDocument
>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     return_document=ReturnDocument.AFTER)
{u'_id': u'userid', u'seq': 1}

Возвращаемые поля могут быть ограничены

>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     projection={'seq': True, '_id': False},
...     return_document=ReturnDocument.AFTER)
{u'seq': 2}

Если документ не существует, вы можете использоватьupsertпараметры для создания документа

>>> db.example.delete_many({}).deleted_count
1
>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     projection={'seq': True, '_id': False},
...     upsert=True,
...     return_document=ReturnDocument.AFTER)
{u'seq': 1}

Если есть несколько результатов запроса, вы можете использовать сортировку для обновления первого отсортированного

>>> for doc in db.test.find({'done': True}):
...     print(doc)
...
{u'_id': 665, u'done': True, u'result': {u'count': 26}}
{u'_id': 701, u'done': True, u'result': {u'count': 17}}
>>> db.test.find_one_and_update(
...     {'done': True},
...     {'$set': {'final': True}},
...     sort=[('_id', pymongo.DESCENDING)])
{u'_id': 701, u'done': True, u'result': {u'count': 17}}

статистика

count()

Получить количество документов в коллекции.

Наконец

Больше API PyMongo, пожалуйста, переместитеофициальная документация