1、连接MongoDB
可以下载使用客户端:MangoDB Compass
# 连接数据库,INT_MONGO是INT环境mongo的连接串
mongo_client = pymongo.MongoClient(INT_MONGO)
2、访问数据库
# 访问数据库Pytest
db = mongo_client["Pytest"]
3、创建集合(表)
# 向Pytest数据库中,创建一个集合(表)Test1,无数据
# 如果该集合不存在则创建成功,返回集合的信息;
# 若该集合已存在,则创建失败:pymongo.errors.CollectionInvalid: collection Test1 already exists
try:
print(db.create_collection("Test1"))
except CollectionInvalid:
print("collection Test1 already exists")
4、删除集合(表)
# 删除Pytest数据库中的集合(表)Test1
# 即使该集合不存在,执行这条命令也不会报错
# 删除成功的返回值: {'ok': 1.0, 'operationTime': Timestamp(1708425975, 6), '$clusterTime': {'clusterTime': Timestamp(1708425975, 6), 'signature': {'hash': b'\x8a\xdf\x87\xe1\x16\xc4\xde\xc8EV<\xf6\xf0\xf0R\xb1\x1a\xdax1', 'keyId': 7304497515062099969}}}
print(db.drop_collection("Test1"))
5、查看已创建的集合(表)
# 查看已有集合
collections = db.list_collections()
for collection in collections:
print(collection)
6、访问集合(表)
# 访问数据表
table = db["Test1"]
7、插入数据
7.1 insert_one()
# 用于向集合插入一个新文档(向数据表中插入一条新记录)
table.insert_one({"title": 'MongoDB',
"description": 'MongoDB 是一个 Nosql 数据库',
"by": 'Tester',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 100
})
7.2 insert_many()
# 向集合中插入多个文档
# writeConcern:写入策略,默认为 1,即要求确认写操作,0 是不要求
# ordered:指定是否按顺序写入,默认 true,按顺序写入
table.insert_many([{"title": 'MongoDB1',
"description": 'MongoDB 是一个 Nosql 数据库',
"by": 'Tester',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 90
}, {"title": 'MongoDB2',
"description": 'MongoDB 是一个 Nosql 数据库',
"by": 'Tester',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 88
}])
7.3 向不存在的集合插入数据
# 如果该集合不存在,但是对该集合执行插入操作,那么 MongoDB 会自动创建该集合并插入文档
table3 = db["Test3"]
table3.insert_one({"title": 'MongoDB',
"description": 'MongoDB 是一个 Nosql 数据库',
"by": 'Tester',
"tags": ['mongodb', 'database', 'NoSQL'],
"likes": 70
})
8、查询数据
8.1 find()
# 查询文档,对多条文档的查询,可以使用find方法
results = table.find({"title": 'MongoDB'})
print(results) # 返回的是个对象
print(type(results)) # 返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。
for result in results:
print(result)
8.2 find_one()
# find_one,仅返回第一条数据。返回结果是一个dict
print(table.find_one({"title": 'MongoDB777'})) # 不存在,返回None
print(table.find_one({"title": 'MongoDB'})) # 存在,返回结果,是dict
8.3 通过objectid查询
from bson import ObjectId
# _id属性是MongoDB在插入过程中自动添加的。可以根据ObjectId来查询,导入bson库里的objectid。如果结果不存在返回None
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))
8.4 find_one_and_update
# 查找后更新,将title更新成MongoDB-xxxx
result = table.find_one_and_update({'_id': ObjectId('661279d4b1955ec1908c51b4')}, {'$set': {"title": "MongoDB-xxxx"}})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))
8.5 find_one_and_replace
# 查找后替换,replacement预期是填写的整条记录。下面这个替换之后,此条记录仅有一个字段title
result = table.find_one_and_replace({'_id': ObjectId('661279d4b1955ec1908c51b4')},
{'title': 'MongoDB-replace',
'description': 'MongoDB 是一个 Nosql 数据库', 'by': 'Tester',
'tags': ['mongodb', 'database', 'NoSQL'], 'likes': 100})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')}))
8.6 find_one_and_delete
# 查找后删除,将删除这条记录
result = table.find_one_and_delete({'_id': ObjectId('661279d4b1955ec1908c51b4')})
print(result)
print(table.find_one({'_id': ObjectId('661279d4b1955ec1908c51b4')})) # 已删除,返回None
8.7 find(),添加过滤条件
# 大于
# 查询返回的结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型。如果结果为空,则返回[]
print([result for result in table.find({"likes": {"$gt": 80}})])
# 小于
print([result for result in table.find({"likes": {"$lt": 90}})])
# 小于等于
print([result for result in table.find({"likes": {"$lte": 88}})])
# 大于等于
print([result for result in table.find({"likes": {"$gte": 90}})])
# 不等于
print([result for result in table.find({"likes": {"$ne": 90}})])
# 在范围内,包括80和100
print([result for result in table.find({"likes": {"$in": [80, 100]}})])
# 不在范围内,闭区间,取小于80和大于100的值
print([result for result in table.find({"likes": {"$nin": [90, 100]}})])
# 正则表达式,查询title以M开头的数据
print([result for result in table.find({"title": {"$regex": "^M.*"}})])
# title属性是否存在
print([result for result in table.find({"title": {"$exists": True}})])
# 类型判断,likes的类型是否是int
print([result for result in table.find({"title": {"$type": "int"}})]) # []
print([result for result in table.find({"likes": {"$type": "int"}})])
# 数字运算,例如mod操作,likes模5余0
print([result for result in table.find({"likes": {"$mod": [5, 0]}})])
# 文本查询,title中包含MongoDB
# print([result for result in table.find({"$text": {"$search": "MongoDB"}})])
# 高级条件查询
print([result for result in table.find({"$where": "obj.likes <= 88"})])
8.8 升序
# 升序排列
print([result for result in table.find({"$where": "obj.likes <= 100"}).sort("likes", pymongo.ASCENDING)])
8.9 降序
# 降序排列
print([result for result in table.find({"$where": "obj.likes <= 100"}).sort("likes", pymongo.DESCENDING)])
8.10 统计结果的count
# 统计结果的count
print(len(list(table.find({"$where": "obj.likes <= 99"}))))
9、偏移
# 偏移。在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移1,就忽略第一个元素,得到第二个及以后的元素
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).skip(0)])
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).skip(1)])
10、limit
# limit方法指定要取的结果个数
print([result for result in table.find({"$where": "obj.likes >= 80"}).sort("likes", pymongo.DESCENDING).limit(1)])
# 在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出。此时可以使用类似如下操作来查询
print([result for result in table.find({"_id": {"$gt": ObjectId('661279d4b1955ec1908c51b5')}})])
11、更新文档
11.1 update_one
# 过滤条件查询后,如果有多条记录,那么update one仅对第一条记录进行修改
table.update_one({"title": 'MongoDB'}, {"$set": {"description": "MongoDB 是一个 Nosql 数据库aaaaaaaaaa"}})
11.2 update_many
# 过滤条件查询后,如果有多条记录,那么update many将对所有记录进行修改。如果缺少该字段,将添加此字段;如果已存在,那就更新数据
table.update_many({"title": 'MongoDB'}, {"$set": {"description": "MongoDB update"}})
12、删除数据
12.1 delete_one
# 过滤条件查询后,如果有多条记录,仅删除第一条记录
table.delete_one({"title": 'MongoDB'})
12.2 delete_many
# 过滤条件查询后,如果有多条记录,将全部删除
table.delete_many({"title": 'MongoDB'})