MongoDB

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

 

安装 MongoDB(以Windows 平台为例)

网址:https://www.mongodb.com/try/download/community

python中的db类 python db文件_数据

下载这个文件,并按提示安装吧。都是下一步下一步,此处不表述了。

python中的db类 python db文件_数据_02

全部完成后,运行MongoDBCompass图形界面管理工具,就能看到它的操作界面,OK!

python中的db类 python db文件_mongodb_03

 

准备数据

为了说明问题,建立数据库--“通讯录数据库”和集合--“学生名单”,设定age、name、sex等3个字段和输入相关数据,这些一会儿就要用到。

python中的db类 python db文件_python中的db类_04

也可以自己先建一个"学生名单.csv"文件,从ADD DATA这个地方导入数据进来。

 

python中的db类 python db文件_数据_05

python中的db类 python db文件_数据库_06

 

PyMongo

Python 要连接 MongoDB 需要 MongoDB 驱动,用pip3安装

pip3 install pymongo

 

操作MongoDB

基本过程:导入pymongo库,连接 MongoDB 服务器,指定相关数据库,指定相关集合(表),最后对数据进行增、删、改、查询或排序操作。

源代码:(从上而下,取消多行注释,逐条测试)

from pymongo import MongoClient
#import pymongo

#注意: 在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一条文档(记录),数据库才会真正创建。

#连接 MongoDB 服务器 方法一
#对应from pymongo import MongoClient
#client = MongoClient(host='localhost',port=27017) #方法一
#client=MongoClient('mongodb://localhost:27017/') #方法二
client=MongoClient('mongodb://admin:123456@localhost:27017/')#如果你设定过用户和密码

#连接 MongoDB 服务器 方法二
#对应import pymongo
#client=pymongo.MongoClient('mongodb://localhost:27017/')
#print(client.list_database_names()) #输出所有数据库

#方法一
#mydb=client.test #数据库
#mycol=mydb.学生名单 #集合,类似SQL的表

#方法二
mydb=client['通讯录数据库']
#print(mydb.collection_names()) #输出所有集合
mycol=mydb['学生名单']

'''
#增加一条
#mydict={'age': 101, 'name': '李四6', 'sex': False}
#print(mycol.insert_one(mydict))

#增加多条
mylist=[
{'age': 100, 'name': '李四7', 'sex': False},
{'age': 102, 'name': '李四8', 'sex': True}
]
m=mycol.insert_many(mylist)
print(m.inserted_ids)


#删除一条
myquery={'name':'李四8'}
mycol.delete_one(myquery)

#删除多条
myquery= {"age":{"$lte":53}}
#myquery= {} #删除所有
m=mycol.delete_many(myquery)
print(f'{m.deleted_count}被删除了')

#删除整个集合
mycol.drop()


#修改一条
myquery={'name':'李四6'}
newvalue={'$set':{'name':'李四3'}}
mycol.update_one(myquery,newvalue)

#修改多条
myquery={'name':'李四7'}
newvalue={'$set':{'name':'李四9'}}
mycol.update_many(myquery,newvalue)


#查询第一条
print(mycol.find_one())

#查询所有
for x in mycol.find():
    #print(x)
    print('年龄:{}'.format(x['age']))

#查询指定字段 0为仅显示此字段以外的字段
for x in mycol.find({},{'age':1}):
    print(x)

#查询指定条件
#myquery={'sex':False}
myquery= {"age":{"$lte":53}}
for x in mycol.find(myquery):
    print(x)

'''

#降序 默认1为顺序
for x in mycol.find().sort('age',-1):
    print(x)

#统计数据条数
print(f'共查到{mycol.count_documents(filter={})}条记录')
print(f'共查到小于等于53岁的{mycol.count_documents(filter={"age":{"$lte":53}})}条记录')


#其他操作
#对索引进行操作相关方法有create_index()、create_indexes()和drop_index()等。
#有兴趣的同学可以自行练习

 

查询条件

从上面的例子,我们可以看到查询条件最为复杂,网上资料分享给大家。

符号

含义

示例

$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]}}

例如,查找年龄为20的数据,则写法如下:

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

但是查询条件变为:年龄大于或等于20的数据,则写法如下:

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

这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为20。

 

正则匹配查询

符号

含义

示例

示例含义

$regex

匹配正则表达式

{'name': {'$regex': '^M.*'}}

name以M开头

$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'}

自身粉丝数等于关注数

例如,查询名字以M开头的学生数据,则写法如下:

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

这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式。