活动地址:CSDN21天学习挑战赛
pip install pymongo
创建数据库连接需要使用MongoClient 对象,并且指定连接的ip地址,端口号,创建的数据库名
- from pymongo import MongoClient
-
-
- def mongodb_init01():
- """数据库连接方式1"""
- client = MongoClient(host='127.0.0.1', port=27017)
- print(client)
-
-
- def mongodb_init02():
- """数据库连接方式2"""
- uri = "mongodb://{}:{}".format('127.0.0.1', 27017)
- client = MongoClient(uri)
- print(client)
-
-
- if __name__ == '__main__':
- mongodb_init01()
- mongodb_init02()
-
输出——
- MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
- MongoClient(host=['127.0.0.1:27017'], document_class=dict, tz_aware=False, connect=True)
数据库的相关操作——
·查看所有数据库名称
·判断数据库是否存在
·使用现有数据库
·创建/删除数据库
- # 返回当前所有数据库名称
- databases_list = client.list_database_names()
-
- # 判断数据库是否存在
- if 'test001' in database_names:
- print("数据库已存在")
- else:
- print("数据库不存在")
-
- # 使用现有数据库(数据库名:test_database)
- test_database = client.test_database
-
- # 创建不存在的数据库并使用
- new_database = client.new_database
-
- # 删除现有数据库
- client.drop_database('new_database')
注意:
·database_names在最新的版本Python中已经废弃,Python3.7以后的版本改为list_data_names().
·在MongoDB中,数据库只有在内容插入后才会创建。也就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建。
·查看所有集合名称
·判断集合是否存在
·使用现有集合
·创建/删除集合
- # 查看当前数据库中的所有集合
- collection_names = new_database.list_collection_names()
-
- # 判断一个集合是否存在
- if 'test001' in collection_names:
- print("集合已存在")
- else:
- print("集合不存在")
-
- # 获取指定数据库下的所有集合对象
- collections = test_database.list_collections()
- for collection in collections:
- print('获取集合:', collection)
-
- # 使用一个已存在数集合(集合名称:test_collection)
- test_collection = new_database.test_collection
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- # 删除一个集合
- new_database.drop('new_collection')
注意:
·collection_names在最新版本的Python中已经废弃,Python3.7以后版本为list_collection_names().
·在MongoDB中,集合只有在内容插入后才会创建。就是说,集合创建后要插入一个数据,集合才会真正创建。
MongoDB中的一个文档类似SQL表的一条记录
插入一个文档
集合插入文档使用insert_one()方法,该方法的第一个参数是字典 name=>value 对
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- # 使用insert_one插入一条数据
- x = new_collection.insert_one({"name": "张三", "age": 18})
-
- print(x) # 输出结果:
打开可视化工具查看结果:

插入多个文档
集合插入多个文档使用 insert_many()方法,该方法的第一个参数就是字典列表。
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- mylist = [
- {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
- {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
- {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"},
- {"name": "曹操", "hometown": "魏国", "age": 45, "sex": "男"},
- {"name": "司马懿", "hometown": "魏国", "age": 45, "sex": "男"},
- {"name": "孙权", "hometown": "吴国", "age": 50, "sex": "男"},
- {"name": "貂蝉", "hometown": "未知", "age": 18, "sex": "女"},
- {"name": "西施", "hometown": "越国", "age": 18, "sex": "女"},
- {"name": "王昭君", "hometown": "西汉", "age": 18, "sex": "女"},
- {"name": "杨玉环", "hometown": "唐朝", "age": 18, "sex": "女"}
- ]
-
- # 使用insert_many插入多条数据
- x = new_collection.insert_many(mylist)

插入指定id的多个文档
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection1 = new_database.new_collection1
-
- mylist = [
- {"_id": 1, "name": "小红"},
- {"_id": 2, "name": "小黑"},
- {"_id": 3, "name": "小白"},
- {"_id": 4, "name": "小蓝"},
- {"_id": 5, "name": "小黄"}
- ]
-
- # 使用insert_many插入多条数据
- x = new_collection1.insert_many(mylist)
-
- # 输出插入的所有文档对应的 _id 值
- print(x.inserted_ids) # 输出结果:[1, 2, 3, 4, 5]

MongoDB中使用了find()和find_one方法来查询集合中的数据,类似与SQL中的SELECT语句。
查询一条数据
find_one()
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- x = new_collection.find_one()
-
- print(x)
{'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
查询集合所有数据
find()
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- for x in new_collection.find():
- print(x)
-
- {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
- {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}
查询指定字段的数据
可以使用find()方法查询指定字段数据,将要返回的字段对应值设置为1
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- for x in new_collection.find({}, {"_id": 0, "name": 1}):
- print(x)
- {'name': '张三'}
- {'name': '张飞'}
- {'name': '关羽'}
- {'name': '刘备'}
- {'name': '曹操'}
- {'name': '司马懿'}
- {'name': '孙权'}
- {'name': '貂蝉'}
- {'name': '西施'}
- {'name': '王昭君'}
- {'name': '杨玉环'}
注意:处理_id,你不能在一个对象中同时指定0和1,如果你设置了一个字段为0,则其它都为1,反之亦然。
根据指定条件查询
我们可以在find()中设置参数进行筛选
例如:查看new_collection集合中age为18的数据
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"age": 18}
-
- mydoc = new_collection.find(myquery)
-
- for x in mydoc:
- print(x)
- {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
- {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}
高级查询
查询的条件语句中,我们还可以使用修饰符
如查看new_collection集合中age大于18的数据
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"age": {"$gt": 18}}
-
- mydoc = new_collection.find(myquery)
-
- for x in mydoc:
- print(x)
- {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
使用正则表达式查询
正则表达式修饰符只用于搜索字符串字段
查看name以张开头的数据,{"$regex:""^张"}
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"name": {"$regex": "^张"}}
-
- mydoc = new_collection.find(myquery)
-
- for x in mydoc:
- print(x)
- {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
- {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
返回指定条数记录
limit()方法
如返回三条文档记录
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myresult = new_collection.find().limit(3)
-
- # 输出结果
- for x in myresult:
- print(x)
- {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '张三', 'age': 18}
- {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '张飞', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bee'), 'name': '关羽', 'hometown': '蜀国', 'age': 40, 'sex': '男'}
updata_one()方法,第一个参数为查阅的条件,第二个参数为要修改的字段,如查找到的匹配数据多余一条,只会修改第一条
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"name": "张三"}
- newvalues = {"$set": {"name": "张三三"}}
-
- new_collection.update_one(myquery, newvalues)

updata_many()
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"name": {"$regex": "^张"}}
- newvalues = {"$set": {"name": "李好啊"}}
-
- new_collection.update_many(myquery, newvalues)

delete_one()删除一个文档,第一个参数为查询对象,指定要删除的数据
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"name": "关羽"}
-
- new_collection.delete_one(myquery)
-
- # 删除后输出
- for x in new_collection.find():
- print(x)
- {'_id': ObjectId('6223413c927c6c0e82b9a4b0'), 'name': '李好啊', 'age': 18}
- {'_id': ObjectId('6223436592276f5f7b639bed'), 'name': '李好啊', 'hometown': '蜀国', 'age': 30, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}
delete_many()
如删除所有name字段中以 李 字开头的文档
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- myquery = {"name": {"$regex": "^李"}}
-
- x = new_collection.delete_many(myquery)
-
- print(x.deleted_count, "个文档已删除")
-
- # 删除后输出
- for x in new_collection.find():
- print(x)
- 2 个文档已删除
- {'_id': ObjectId('6223436592276f5f7b639bef'), 'name': '刘备', 'hometown': '蜀国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf0'), 'name': '曹操', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf1'), 'name': '司马懿', 'hometown': '魏国', 'age': 45, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf2'), 'name': '孙权', 'hometown': '吴国', 'age': 50, 'sex': '男'}
- {'_id': ObjectId('6223436592276f5f7b639bf3'), 'name': '貂蝉', 'hometown': '未知', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf4'), 'name': '西施', 'hometown': '越国', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf5'), 'name': '王昭君', 'hometown': '西汉', 'age': 18, 'sex': '女'}
- {'_id': ObjectId('6223436592276f5f7b639bf6'), 'name': '杨玉环', 'hometown': '唐朝', 'age': 18, 'sex': '女'}
delete_many传入空的查询则删除所有文档
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- x = new_collection.delete_many({})
-
- print(x.deleted_count, "个文档已删除")
-
- # 删除后输出
- for x in new_collection.find():
- print(x)
drop()方法
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- new_collection.drop()
sort方法第一个参数为要排序字段,第二个指定排序规则,为升序,-1为降序,默认升序
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- mylist = [
- {"name": "张飞", "hometown": "蜀国", "age": 30, "sex": "男"},
- {"name": "关羽", "hometown": "蜀国", "age": 40, "sex": "男"},
- {"name": "刘备", "hometown": "蜀国", "age": 50, "sex": "男"}
- ]
-
- # 使用insert_many插入多条数据
- x = new_collection.insert_many(mylist)
-
- mydoc = new_collection.find().sort("name")
- for x in mydoc:
- print(x)
- from pymongo import MongoClient
-
- client = MongoClient(host='127.0.0.1', port=27017, tz_aware=True)
-
- # 创建新的数据库
- new_database = client.new_database
-
- # 创建一个新的集合
- new_collection = new_database.new_collection
-
- mydoc = new_collection.find().sort("age", -1)
- for x in mydoc:
- print(x)