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
документ запроса
db.test.find({"hello": "world"})
Сопоставляет только документы с ключевым словом «привет» со значением «мир». Вызывает TypeError, если какой-либо аргумент имеет неправильный тип. Возвращает экземпляр Cursor, соответствующий этому запросу.
Запросить один документ
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_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}
Найдите один документ и обновите его, вернув исходный документ или обновленный документ.
>>> 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}}
статистика
Получить количество документов в коллекции.
Наконец
Больше API PyMongo, пожалуйста, переместитеофициальная документация