一.mongodb是什么?
MongoDB是一个NoSQL的非关系型数据库 ,支持海量数据存储,高性能的读写
1.mongo的体系结构
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
2. mongoDB的特点(或使用场景)
-
支持存储海量数据;(例如:直播中的打赏数据);
-
支持频繁的数据读写;(例如:游戏道具);
-
数据安全性不高,存在数据误差(丢失数据);
-
mongoDB不支持多表操作,不支持事务;
-
mongoDB使用Bson存储格式,支持动态字段管理;
3. mongoDB与mysql、redis对比
与redis对比
1. redis纯内存数据库,内存不足时触发淘汰策略,mongoDB使用内存加磁盘的存储策略具有高扩展性; 2. mongoDB使用Bson存储格式,支持动态字段管理方便扩展
与mysql对比
1. mongoDB不支持多表操作,不支持事务; 2. mongoDB使用Bson存储格式,支持动态字段管理;
查询效率对比
Redis > MongoDB > MySQL
4. mongoDB存储原理
-
mongoDb采用内存加磁盘的方式存储数据
-
mongoDb支持数据分片,当单一的服务器中磁盘不够用的时候,还可以串联其他服务器;
-
客户端的请求到达内存时,先在日志中记录下操作记录,然后再去操作内存;
-
内存中的日志每10ms向磁盘中的日志进行同步一次,数据则每分钟同步一次;
-
客户端先去内存中查询数据,内存中没有再去查询磁盘;
-
当客户端写入的时候,会先写入到内存中,内存中写入后请求直接返回,内存中的数据会根据同步策略同步到磁盘;
-
如果机器宕机,在重启服务的时候会解析磁盘中的日志和磁盘中的数据进行对比,将未入到磁盘中的数据写入磁盘,但可能会丢失10ms的数据;
二. 使用docker安装mongo
1.安装
1.拉取mongo镜像
docker pull mongo:4.4
2. 创建mongo数据持久化目录
mkdir -p /docker_volume/mongodb/data
3. 运行容器
docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth
-v: 将宿主机的/docker_volume/mongodb/data映射到容器的/data/db目录,将数据持久化到宿主机,以防止删除容器后,容器内的数据丢失
–auth:需要密码才能访问容器服务
2.创建用户
1. 登录mongo容器,并进入到【admin】数据库
docker exec -it mongo mongo admin
2. 创建一个用户,mongo 默认没有用户
db.createUser({ user:'root',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},'readWriteAnyDatabase']});
【user:‘root’ 】:设置用户名为root 【pwd:‘123456’】:设置密码为123456 【role:‘userAdminAnyDatabase’】:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 【db: ‘admin’】:可操作的数据库 【‘readWriteAnyDatabase’】:赋予用户读写权限
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
3. 连接、测试
1. 连接mongo数据库
db.auth('root', '123456')
2. 测试数据库,插入一条语句
db.user.insert({"name":"zhangsan","age":18})
3. 测试数据库,查询刚才插入的语句
db.user.find()
4.navicat连接测试
三. 项目使用mongodb
1. 常用命令
#查看已经存在的数据库 show dbs; #创建数据库 use 数据库名 #删除数据库 db.dropDatabase() #查看集合 show collections; #创建集合 db.createCollection("news") #删除集合 db.runoob.drop() #添加数据 db.集合名.insert({'id':1,'title':'12'}) #查询所有 db.集合名.find() #删除数据 db.集合名.remove({"id":1}) #条件查询 db.集合名.find({"id":1})
2. pymongo使用
1. 安装
pip install pymongo
2. pymysql连接
import pymongo from urllib import parse username = parse.quote_plus('mofang') # 对用户名进行编码 password = parse.quote_plus('123456') # 对密码进行编码 database = "mofang" # 数据库名称 host = "127.0.0.1" port = "27017" mongo = pymongo.MongoClient('mongodb://%s:%s@%s:%s/%s' % ( username, password, host, port, database))
3. 数据库操作
import pymongo # 数据库连接 mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") # 创建数据库 my_db = mongo["my_db"] # 没有往集合里面保存文档之前,mongdb不会真正创建集合! # 查看数据库列表 print(mongo.list_database_names()) # 上面的 my_db 因为没有内容,所以没有被创建的。
4. 集合操作
import pymongo mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") my_db = mongo["my_db"] my_collection = my_db["my_collection"] # 没有往集合里面保存文档之前,mongdb不会真正创建集合! # 查看集合列表 print(my_db.list_collection_names()) # 删除集合 my_collection.drop() # 删除成功返回true,如果集合不存在,返回false
5. 添加
import pymongo mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") my_db = mongo["my_db"] my_collection = my_db["my_collection"] # 添加一个文档 document = { "name": "xiaoming", "mobile": "13012345678","age":16} ret = my_collection.insert_one(document) print(ret.inserted_id) # 返回InsertOneResult对象 # 插入文档时,如果没有指定_id,将自动分配一个唯一的id。 # 添加多个文档 document_list = [ { "name": "xiaoming", "mobile": "13033345678","age":17}, { "name": "xiaohong", "mobile": "13044345678","age":18}, { "name": "xiaohei", "mobile": "13612345678","age":18}, ] ret = my_collection.insert_many(document_list) # 打印文档_id值列表: print(ret.inserted_ids)
6. 删除
import pymongo mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") my_db = mongo["my_db"] my_collection = my_db["my_collection"] # 删除一个文档 query = {"name":"xiaoming"} my_collection.delete_one(query) # 删除多个文档 query = { "mobile": {"$regex": "^130"} } ret = my_collection.delete_many(query) print("删除了%d个文档" % ret.deleted_count) import pymongo from urllib.parse import quote_plus from bson import ObjectId if __name__ == "__main__": username = quote_plus("mofang") password = quote_plus("123456") # 获取数据库连接对象 mongo = pymongo.MongoClient(f"mongodb://{username}:{password}@127.0.0.1:27017/mofang") mofang = mongo["mofang"] user_list = mofang["user_list"] """删除文档""" query = {"_id": ObjectId("60d925e127bd4b7769251002")} ret = user_list.delete_one(query) print(ret) print(ret.deleted_count) """删除多个文档""" query = {"name": "xiaolan"} ret = user_list.delete_many(query) print(ret.deleted_count)
7. 更新
import pymongo mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") my_db = mongo["my_db"] my_collection = my_db["my_collection"] # 更新一个文档 query = { "name": "xiaoming" } data = { "$set": { "age": 18 } } my_collection.update_one(query, data) # 更新所有文档 query = { "mobile": {"$regex": "^130"} } data = { "$set": { "age": 18 } } my_collection.update_many(query, data)
8. 查询文章来源:https://www.toymoban.com/news/detail-783192.html
import pymongo mongo = pymongo.MongoClient("mongodb://127.0.0.1:27017/") my_db = mongo["my_db"] my_collection = my_db["my_collection"] # 查看一个文档 ret = my_collection.find_one() print(ret) # 查看所有文档 for document in my_collection.find(): print(document) # 查看文档部分字段,find和find_one的第二个参数表示控制字段的显示隐藏,1为显示,0为隐藏 for document in my_collection.find({},{ "_id": 0, "name": 1, "mobile": 1 }): print(document) # 条件查询 query = { "age": 18 } document_list = my_collection.find(query) for document in document_list: print(document) # 比较运算符 query = { "age": {"$gt":17} } document_list = my_collection.find(query) for document in document_list: print(document) # 排序显示 # 单个字段排序: # sort("键", 1) 升序 # sort("键",-1) 降序 # 多个字段排序: # sort([("键1",1),("键2",-1)]) document_list = my_collection.find().sort("age") for document in document_list: print(document) # 限制查询结果数量 document_list = my_collection.find().limit(3) print(document_list) # 偏移、跳过 # skip(int) document_list = my_collection.find().limit(3).skip(3) # 从第3篇文档开始获取3篇文档 print(document_list) # 自定义条件函数 document_list = my_collection.find({"$where":"this.age==18"}) print(document_list)
select o.create_time,o.status,o.account,od.name,od.count,od.price from orders as o inner join detail as od on o.number=od.order_id where userid=o.userid order by o.create_time desc
评价文章来源地址https://www.toymoban.com/news/detail-783192.html
到了这里,关于docker安装mongoDB及使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!