MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库
当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
正是因为上述特点,mongodb 数据库对前端数据的格式非常友好,上手操作起来也比较快。
我们直接去mongodb官网进行下载https://www.mongodb.com/try/download/community
下载得到安装包后一路默认就好,这个过程会默认下载MongoDBCompass(mongodb数据库的可视化工具)所以需要等一会。
此时我们可以访问http://localhost:27017/
,若出现下图结果则说明安装成功。
安装好后mongodb会默认启动并且默认的端口为
27017
先找到下载好的mongodb文件夹,默认的话可以按照下图的文件路径找,然后打开其中的mongod.conf
文件
文件中默认内容如下
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# Where and how to store data.
storage:
dbPath: C:\Program Files\MongoDB\Server\5.0\data
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: C:\Program Files\MongoDB\Server\5.0\log\mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1
#processManagement:
#security:
#operationProfiling:
#replication:
#sharding:
## Enterprise-Only Options:
#auditLog:
#snmp:
修改mongodb默认端口以及外网可访问
我们修改
port: 27017
bindIp: 127.0.0.1
为
port: 668
bindIp: 0.0.0.0
设置连接需密码验证
默认事不需要密码就可以连接的,所以很不安全
修改
#security:
为
security:
authorization: enabled
此时我们重启mongodb数据库即可让配置生效
打开任务管理器,在服务中找到Mongodb,并选择重新启动
启动成功后可访问http://localhost:668/
若出现下图则说明重启并配置成功
先打开高级系统设置,进入双击进入环境变量设置
注意: 添加的路径要跟自己安装下载mongodb的位置有关
查看是否配置成功
打开命令行执行
mongo -port=668
(这里事因为我们之前修改了端口需要自己指定),出现下图结果说明启动成功
紧接着上一步操作
我们继续再命令行中输入
使用管理员权限
use admin
这里根据自己的需求设置用户名密码,
设置roles为root设置该用户为超级管理员(就是没啥操作限制)
db.createUser({user:"root",pwd:"ywh",roles:["root"]})
查看已经成功创建的用户
show users
到这我们就成功创建好一个超级用户了,后面我们通过
MongoDBCompass
进行连接
设置连接信息
修改URL下的内容为
mongodb://root:ywh@localhost:668?authSource=admin&readPreference=primary&directConnection=true&ssl=false
对应的格式为:
mongodb://用户名:密码@ip:mongodb的端口?authSource=admin&readPreference=primary&directConnection=true&ssl=false
设置好后点Connect
进行连接,再成功连接后我们可以按照下图操作步骤创建一个库以及表
创建成功后就会看到下面,多了一个数据库的信息,我们可以点击进入。
点进入数据test
表查看表中的详细信息
刚开始表中当然是没数据的,我们可以进行插入操作
成功插入数据的结果
先下载使用的包
pip install pymongo
根据自己的
mongodb
配置进行连接信息的修改
from pymongo import MongoClient
def connect(ip="localhost",port="668",databaseName="MongoDemo",schemaName="txt"):
"""
:param url: ip地址
:param port_id:连接数据库的端口 默认为688
:param databaseName: 对应的数据库名字
:param schemaName: 操作的表明
:return schema: 表的实体
"""
db = MongoClient(f"mongodb://ywh:ywh123@{ip}:{port}")
my_db = db[databaseName] #打开对应的数据库
schema = my_db[schemaName] #打开数据库的中的表
return schema
主要是用
find
和find_one
这两个函数进行查找, 增删改查都类似的,后面就只讲多条的操作。
class MongoFind(object):
def __call__(self):
pass
@staticmethod
def findall(filterOption={},schemaName="txt"):
"""
## 查询多条
:pramas filterOption: 条件
:pramas schemaName: 表名
"""
schema = connect(schemaName=schemaName)
# 空条件为查询全部
data = schema.find(filterOption)
resData = [item for item in data]
return resData
@staticmethod
def findOne(filterOption={},schemaName="txt"):
"""
## 查询单条
:pramas filterOption: 条件
:pramas schemaName: 表名
"""
schema = connect(schemaName=schemaName)
data = schema.find_one(filterOption)
print(data)
def insertData():
schema = connect()
more_data = [
{'id': 2, 'name': '张三', 'age': 10, 'salary': 0},
{'id': 3, 'name': '李四', 'age': 30, 'salary': -100},
{'id': 4, 'name': '王五', 'age': 40, 'salary': 1000},
{'id': 5, 'name': '外国人', 'age': 50, 'salary': '未知'}]
# 返回插入数据对应的id
InsertManyResult = schema.insert_many(more_data)
print(InsertManyResult.inserted_ids)
def delData():
schema = connect()
data = schema.delete_many({})
print(data)
def updateData():
schema = connect()
schema.update_many({"name":"张三"},{"$set":{"age":100}})
符号 | 含义 | 示例 |
---|---|---|
$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]}} |
例如
{'age': {'$in': [20, 23]}}
代表查询age为20或者23的。
正则匹配查询
符号 | 含义 | 示例 | 含义 |
---|---|---|---|
$regex | 匹配正则表达式 | {‘name’: {‘$regex’: ‘^Y.*’}} | name 以Y开头 |
$exists | 属性是否存在 | {‘name’: {‘$exists’: True}} | name 属性存在 |
$type | 类型判断 | {‘age’: {‘$type’: ‘int’}} | age的类型为 int |
$mod | 数字模操作 | {‘age’: {‘$mod’: [5, 0]}} | 年龄模5余0 |
$text | 文本查询 | {‘KaTeX parse error: Expected '}', got 'EOF' at end of input: text': {'search’: ‘Mike’}} | text 类型的属性中包含Mike 字符串 |
$where |
高级条件查询 | {‘$where’: ‘obj.fans_count == obj.follows_count’} | 自身粉丝数等于关注数 |