Операции Python MongoDB достаточно, чтобы прочитать эту статью

задняя часть база данных Python MongoDB

MongoDB — нереляционная база данных, написанная на языке C++.Это система баз данных с открытым исходным кодом, основанная на распределенном хранилище файлов.Его форма хранения контента аналогична объектам JSON.Его значения полей могут включать другие документы,массивы и массивы документов, что очень гибко. В этом разделе мы рассмотрим операции хранения MongoDB в Python 3.

1. Подготовка

Прежде чем начать, убедитесь, что у вас установлена ​​MongoDB и запущены ее службы, а также установлена ​​библиотека PyMongo для Python.

2. Подключитесь к MongoDB

При подключении к MongoDB нам нужно использовать библиотеку PyMongoMongoClient. Вообще говоря, вы можете передать IP и порт MongoDB, где первым параметром является адресhost, второй параметр - портport(Если вы не передадите ему параметр, по умолчанию будет 27017):

import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)

Это создаст объект подключения MongoDB.

Кроме того,MongoClientпервый параметрhostВы также можете напрямую передать строку подключения MongoDB, которая начинается сmongodbв начале, например:

client = MongoClient('mongodb://localhost:27017/')

Это также может обеспечить тот же эффект соединения.

3. Укажите базу данных

В MongoDB можно создать несколько баз данных, а затем нам нужно указать, с какой базой данных работать. В качестве примера возьмем тестовую базу данных, следующим шагом будет указание базы данных, которая будет использоваться в программе:

db = client.test

позвони сюдаclientизtestсвойство для возврата тестовой базы данных. Конечно, мы также можем указать это:

db = client['test']

Эти два способа эквивалентны.

4. Укажите коллекцию

Каждая база данных в MongoDB содержит множество коллекций, которые аналогичны таблицам в реляционных базах данных.

Следующим шагом является указание коллекции для работы.Здесь укажите имя коллекции как студентов. Как и при указании базы данных, существует два способа указать коллекцию:

collection = db.students
collection = db['students']

Таким образом, мы объявляемCollectionобъект.

5. Вставьте данные

Далее можно вставить данные. Для коллекции студентов создайте новые данные о студентах, которые представлены в виде словаря:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

Здесь указывается студенческий билет, имя, возраст и пол. Далее звоните напрямуюcollectionизinsert()способ вставки данных, код выглядит следующим образом:

result = collection.insert(student)
print(result)

В MongoDB каждый фрагмент данных фактически имеет_idатрибут для уникальной идентификации. Если это свойство не указано явно, MongoDB автоматически сгенерируетObjectIdТип_idАтрибуты.insert()метод вернется после выполнения_idценность.

Результаты приведены ниже:

5932a68615c2606814c91f3d

Конечно, мы также можем вставлять несколько фрагментов данных одновременно, просто передаем их в виде списка, пример такой:

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert([student1, student2])
print(result)

Возвращаемый результат соответствует_idКоллекция:

[ObjectId('5932a80115c2606a59e8a048'), ObjectId('5932a80115c2606a59e8a049')]

На самом деле, в версии PyMongo 3.x он официально объявлен устаревшим.insert()метод. Конечно, нет ничего плохого в том, чтобы продолжать его использовать. Официально рекомендуетсяinsert_one()иinsert_many()метод для вставки одной записи и нескольких записей соответственно, пример выглядит следующим образом:

student = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

result = collection.insert_one(student)
print(result)
print(result.inserted_id)

Результаты приведены ниже:

<pymongo.results.InsertOneResult object at 0x10d68b558>
5932ab0f15c2606f0c1cf6c5

иinsert()Метод другой, на этот раз возвратInsertOneResultобъект, мы можем назвать егоinserted_idприобретение собственности_id.

заinsert_many()метод, мы можем передать данные в виде списка, пример такой:

student1 = {
    'id': '20170101',
    'name': 'Jordan',
    'age': 20,
    'gender': 'male'
}

student2 = {
    'id': '20170202',
    'name': 'Mike',
    'age': 21,
    'gender': 'male'
}

result = collection.insert_many([student1, student2])
print(result)
print(result.inserted_ids)

Результаты приведены ниже:

<pymongo.results.InsertManyResult object at 0x101dea558>
[ObjectId('5932abf415c2607083d3b2ac'), ObjectId('5932abf415c2607083d3b2ad')]

Тип, возвращаемый этим методом,InsertManyResult,перечислитьinserted_idsсвойство может получить вставленные данные_idсписок.

6. Запрос

После вставки данных мы можем использоватьfind_one()илиfind()метод запроса, гдеfind_one()Запрос получает единственный результат,find()возвращает объект генератора. Пример выглядит следующим образом:

result = collection.find_one({'name': 'Mike'})
print(type(result))
print(result)

Здесь мы спрашиваемnameзаMikedata, его возвращаемый результат является типом словаря, а текущий результат выглядит следующим образом:

<class 'dict'>
{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}

Можно обнаружить, что их больше_idатрибут, это то, что MongoDB автоматически добавляет во время вставки.

Кроме того, мы также можемObjectIdДля запроса нужно использовать библиотеку bsonobjectid:

from bson.objectid import ObjectId

result = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})
print(result)

Результат запроса по-прежнему имеет тип словаря, как показано ниже:

{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}

Конечно, если результат запроса не существует, он вернетNone.

Для нескольких запросов данных мы можем использоватьfind()метод. Например, здесь ищем данные с возрастом 20 лет, пример такой:

results = collection.find({'age': 20})
print(results)
for result in results:
    print(result)

Результаты приведены ниже:

<pymongo.cursor.Cursor object at 0x1032d5128>
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}

Возвращаемый результатCursorтип, он эквивалентен генератору, нам нужно пройти, чтобы получить все результаты, каждый из которых является типом словаря.

Если вы хотите запросить данные, возраст которых больше 20 лет, это записывается следующим образом:

results = collection.find({'age': {'$gt': 20}})

Запрошенное здесь значение ключа условия больше не является простым числом, а представляет собой словарь, имя ключа которого является символом сравнения.$gt, что означает больше, а значение ключа равно 20.

Символы сравнения приведены в следующей таблице.

символ значение Пример
$lt меньше, чем {'age': {'$lt': 20}}
$gt больше, чем {'age': {'$gt': 20}}
$lte меньше или равно {'age': {'$lte': 20}}
$gte больше или равно {'age': {'$gte': 20}}
$ne не равно {'age': {'$ne': 20}}
$in в рамках {'age': {'$in': [20, 23]}}
$nin вне диапазона {'age': {'$nin': [20, 23]}}

Кроме того, вы также можете выполнять обычные запросы на сопоставление. Например, чтобы запросить данные учащихся, имена которых начинаются с буквы М, пример выглядит следующим образом:

results = collection.find({'name': {'$regex': '^M.*'}})

использовать здесь$regexчтобы указать обычное совпадение,^M.*Представляет регулярное выражение, начинающееся с буквы М.

Здесь некоторые функциональные символы переклассифицированы в следующую таблицу.

символ значение Пример Пример значения
$regex соответствие регулярному выражению {'name': {'$regex': '^M.*'}} nameначинается с М
$exists Существует ли недвижимость {'name': {'$exists': True}} nameсвойство существует
$type Типовое суждение {'age': {'$type': 'int'}} ageимеет типint
$mod Цифровой аналоговый режим {'age': {'$mod': [5, 0]}} Возраст по модулю 5 больше 0
$text текстовый запрос {'$text': {'$search': 'Mike'}} textАтрибут типа содержитMikeнить
$where Расширенный условный запрос {'$where': 'obj.fans_count == obj.follows_count'} Количество подписчиков равно количеству подписчиков

Более подробное использование этих операций можно найти в официальной документации MongoDB:
https://docs.MongoDB.com/manual/reference/operator/query/.

7. Подсчет

Чтобы подсчитать, сколько фрагментов данных содержится в результате запроса, вы можете вызватьcount()метод. Например, чтобы подсчитать все элементы данных:

count = collection.find().count()
print(count)

Или считать данные, соответствующие определенному условию:

count = collection.find({'age': 20}).count()
print(count)

Результатом операции является числовое значение, то есть количество фрагментов данных, удовлетворяющих условиям.

8. Сортировать

При сортировке звоните напрямуюsort()метод и передать отсортированные поля и флаги возрастающего и убывающего порядка. Пример выглядит следующим образом:

results = collection.find().sort('name', pymongo.ASCENDING)
print([result['name'] for result in results])

Результаты приведены ниже:

['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']

Здесь мы звонимpymongo.ASCENDINGУкажите порядок возрастания. Если вы хотите отсортировать по убыванию, вы можете передатьpymongo.DESCENDING.

9. Смещение

В некоторых случаях мы можем захотеть взять только несколько элементов, тогда мы можем использоватьskip()Метод смещается на несколько позиций, таких как смещение 2, первые два элемента игнорируются, а третий и последующие элементы получаются:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2)
print([result['name'] for result in results])

Результаты приведены ниже:

['Kevin', 'Mark', 'Mike']

Кроме того, вы также можете использоватьlimit()Метод указывает количество результатов для выборки, например:

results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)
print([result['name'] for result in results])

Результаты приведены ниже:

['Kevin', 'Mark']

если не использоватьlimit()Метод изначально вернет три результата, после добавления лимита он перехватит два результата и вернется.

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

from bson.objectid import ObjectId
collection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})

В это время вам нужно записать последний запрос_id.

10. Обновление

Для обновления данных мы можем использоватьupdate()метод, укажите условия обновления и обновляемые данные. Например:

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)

Здесь мы обновляемnameзаKevinВозраст данных: сначала укажите условия запроса, затем запросите данные, измените возраст и вызовитеupdate()Метод передает исходное состояние и измененные данные.

Результаты приведены ниже:

{'ok': 1, 'nModified': 1, 'n': 1, 'updatedExisting': True}

Возвращаемый результат находится в форме словаря,okВо имя успешного исполнения,nModifiedПредставляет количество затронутых гистограмм.

В качестве альтернативы мы также можем использовать$setОператор обновляет данные, код такой:

result = collection.update(condition, {'$set': student})

Это будет только обновлениеstudentПоля, существующие в словаре. Если изначально были другие поля, они не будут ни обновлены, ни удалены. а если нет$setЕсли это так, он будет использовать все предыдущие данныеstudentЗамена словаря; другие поля удаляются, если они изначально существовали.

Кроме того,update()Этот метод на самом деле является официально устаревшим методом. Здесь также делятся наupdate_one()Методы иupdate_many()методы, использование более строгое, их второй параметр необходимо использовать$В качестве имени ключа словаря используется оператор типа, пример следующий:

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 26
result = collection.update_one(condition, {'$set': student})
print(result)
print(result.matched_count, result.modified_count)

звонил сюдаupdate_one()метод, второй параметр больше не может напрямую передаваться в измененный словарь, но должен использовать{'$set': student}В этой форме возвращаемый результатUpdateResultтип. а потом позвониmatched_countиmodified_countсвойство, вы можете получить количество совпадающих данных и затронутых данных.

Результаты приведены ниже:

<pymongo.results.UpdateResult object at 0x10d17b678>
1 0

Давайте посмотрим на другой пример:

condition = {'age': {'$gt': 20}}
result = collection.update_one(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

Здесь указанное условие запроса состоит в том, что возраст больше 20 лет, а затем условие обновления{'$inc': {'age': 1}}, то есть возраст увеличивается на 1. После выполнения возраст первых подходящих данных будет увеличен на 1.

Результаты приведены ниже:

<pymongo.results.UpdateResult object at 0x10b8874c8>
1 1

Вы можете видеть, что количество совпадений равно 1, и количество влияний также равно 1.

если звонишьupdate_many()метод, все подходящие данные будут обновлены, например:

condition = {'age': {'$gt': 20}}
result = collection.update_many(condition, {'$inc': {'age': 1}})
print(result)
print(result.matched_count, result.modified_count)

В настоящее время количество совпадений больше не равно 1, и текущий результат выглядит следующим образом:

<pymongo.results.UpdateResult object at 0x10c6384c8>
3 3

Как видите, все соответствующие данные будут обновлены в это время.

11. Удалить

Операция удаления относительно проста, вызов непосредственноremove()В методе задаются условия удаления, и все данные, удовлетворяющие условиям, будут удалены. Пример выглядит следующим образом:

result = collection.remove({'name': 'Kevin'})
print(result)

Результаты приведены ниже:

{'ok': 1, 'n': 1}

Кроме того, здесь есть еще два новых рекомендуемых метода —delete_one()иdelete_many(). Пример выглядит следующим образом:

result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)

Результаты приведены ниже:

<pymongo.results.DeleteResult object at 0x10e6ba4c8>
1
4

delete_one()То есть удалить первые подходящие данные,delete_many()То есть удалить все подходящие данные. Их обратные результатыDeleteResultтипа, который можно назватьdeleted_countСвойство получает количество удаленных элементов данных.

12. Прочие операции

Кроме того, PyMongo также предоставляет некоторые комбинированные методы, такие какfind_one_and_delete(),find_one_and_replace()иfind_one_and_update(), это операции поиска после удаления, замены и обновления, и их использование в основном такое же, как и вышеописанные методы.

Кроме того, вы также можете работать с индексом, и соответствующие методыcreate_index(),create_indexes()иdrop_index()Ждать.

Подробное описание использования PyMongo см. в официальной документации: http://api.mongodb.com/python/current/api/pymongo/collection.html.

Кроме того, есть некоторые операции с базой данных и самой коллекцией, которые здесь объясняться не будут, вы можете обратиться к официальной документации: http://api.mongodb.com/python/current/api/pymongo/.

В этом разделе объясняется, как использовать PyMongo для управления MongoDB для добавления, удаления и модификации данных.



Этот ресурс был впервые опубликован в личном блоге Цуй Цинцай Цзин Ми:Практическое руководство по разработке веб-краулера на Python3 | Цзин Ми

Если вы хотите узнать больше информации о поисковых роботах, обратите внимание на мой личный публичный аккаунт WeChat: Coder of Attack.

WeChat.QQ.com/Day/5 Это радость VE Z…(автоматическое распознавание QR-кода)