MongoDB基础学习笔记

'''
https://www.runoob.com/python3/python-mongodb.html   Python MongoDB 菜鸟教程

MongoDB适合存储一些关系简单、数据量又很大的数据,比如我们的平台上虚拟机的监控信息,包括内存、IO、CPU、网络等数据,
每隔几秒就采集一次数据,每周、每月,量很大,而且旧的监控数据也不会保留太长时间,就使用的mongodb来存储这些数据

1.Mongodb/Mysql
数据库模型: 非关系型/关系型;
存储方式: 虚拟内存+持久化/不同的引擎有不同的存储方式;
查询语句:独特的mongodb查询方式/传统sql语句;
数据处理方式:基于内存,将热数据存在物理内存中,从而达到高速读写/不同的引擎拥有其自己的特点。

2.Mongodb的优势
2.1:快速!拥有适量级内存的mongodb的性能是非常迅速的,它将热数据存储在物理内存中(而不仅仅是索引和少部分数据),
使得热数据的读写变得十分快速,从而提高了整体的速度与效率。
热数据:是需要被计算点频繁访问的在线类数据。
冷数据:是对于离线类不经常访问的数据,比如企业备份数据,业务与操作日志数据,话单与统计数据。
2.2:高扩展性!mongodb的高可用与集群架构拥有十分高的扩展性,通过物理机器的增加,以及sharding的增加,mongodb的扩展将达到一个十分惊人的地步。
2.3:自身的Failover机制!mongodb的副本集配置中,当主库遇到问题,无法继续提高服务的时候,副本集将选举出一个新的主库来继续提供服务。
2.4: Json的存储格式!mongodb的json与Bson存储格式十分适合文档格式的存储与查询。

3.mongodb的劣势
3.1:应用经验较少
3.2: 非关系型的数据库模型可能会造成部分新使用者的不适应,由于用惯了关系型数据库,mongodb的操作语句会显得较为的陌生。
3.3:锁机制!尽管Mongodb2.0以后的lock机制已经由全锁变为了db锁,但是对于仅用一个db的用户来说,lock还是会有一定的产生,从而导致队列堆积。
3.4:无事务机制!mongodb本身没有自带事务机制,故如果需要在mongo中实现机制,需要通过一个额外的表,从逻辑上自行实现事务。

总体上讲:
由于MongoDB独特的数据处理方式,可以将热点数据加载到内存,故而对查询来讲,会非常快(当然也会非常消耗内存);
同时由于采用了BSON的方式存储数据,故而对JSON格式数据具有非常好的支持性以及友好的表结构修改性,文档式的存储方式,
数据友好可见;数据库的分片集群负载具有非常好的扩展性以及非常不错的自动故障转移(大赞)。

不足:数据库的查询采用了特有的查询方式,有一定的学习成本(不高);索引不咋滴;锁只能提供到collection级别,
还做不到行级锁;没有事务机制(不能回滚啊);学习资料肯定没有MySQL的多。


4.compass的基础使用
Compass操作:
4.1.https://www.jianshu.com/p/9a25c271bd06
在filter内输入过滤条件
在project内输入显示哪些字段
在sort内输入按哪个字段排序
在collation内输入显示结果数量,skip数值表标跳过前面多少个结果,limit数据表示只显示前面多少个结果

5.基础操作(shell)
命令行方式启动服务:
在解压的目录中,手动创建一个目录用于存放数据文件,如data/db;
在bin目录中打开命令提示符,输入如下命令:
mongod --dbpath=../data/db

shell连接(mongo命令)
mongo
或
mongo --host=127.0.0.1 --port=27017

5.1.查看已有的数据库: show dbs				退出mongodb: exit
5.2.选择和创建数据库: use 数据库名称	查看当前正在使用的数据库 db
5.3.集合的显式创建:db.createCollection(name)	查看当前库中的集合:show collections
5.4.集合的删除:	db.collection.drop()  或 db.collection.drop()
5.5.单条文档的插入: db.collection.insert({})	文档的查询:	db.collection.find() 或 db.collection.find({ : })  --带条件查询
5.6.多条文档的插入:	db.collection.insertMany([{},{}])		返回查询的第一条数据; db.collection.findOne({:})
5.7.查询集合中指定的字段:db.collection.find({字段:1})  --1代表显示, 0代表不显示
5.8.批量插入异常,mongodb不会进行回滚,可以使用try catch进行异常捕捉处理:
try{
db.collection.insertMany([{},{}])
} catch(e){
	print(e);
}
...

6.python 对MongoDB的基础操作
使用PyMongo驱动来连接数据库  from pymongo import MongoClient
'''
# -*- coding:utf-8 -*-
from pymongo import MongoClient
# 使用 PyMongo 驱动来连接
myClient = MongoClient("127.0.0.1", port=27017)

# 查看现有的数据库集合
dbList = myClient.list_database_names()
print(dbList)

# 判断数据库test是否存在
if 'test' in dbList:
    print('test数据库存在')
else:
    print('test数据库不存在')

# 创建一个集合(集合类似关系型数据库中的表)
# 指定使用的数据库
myDb = myClient.test
# 查看所有的集合
collists = myDb.list_collection_names()
print(collists)
# 判断集合是否存在
if 'p01' in collists:
    print('p01集合存在')
else:
    print('p01集合不存在')

# 增
mydict = {"sql": "mongodb", "development": "python", "data": "datax"}
# 单条插入insert_one()
rs1 = myDb.p01.insert_one(mydict)
print(rs1)  # <pymongo.results.InsertOneResult object at 0x02E244B8>  返回对象
print(rs1.inserted_id)  # 返回唯一 _id
# 多条插入insert_many()
mylist = [
    {"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"},
    {"name": "QQ", "alexa": "101", "url": "https://www.qq.com"},
    {"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com"},
    {"name": "知乎", "alexa": "103", "url": "https://www.zhihu.com"},
    {"name": "Github", "alexa": "109", "url": "https://www.github.com"}
]
rs2 = myDb.p02.insert_many(mylist)
print(rs2)
print(rs2.inserted_ids)

# 删
# delete_one()删除一个指定的文档
myDb.p02.delete_one({"_id": "5ed50ce45d5b9de809662951"})
print('删除成功')
# delete_many()删除多个文档
my_delete = {"name": {"$regex": "^F"}}
rs3 = myDb.p02.delete_many(my_delete)
print(rs3.deleted_count, '个文档已被删除')
# 删除集合中的所有文档,delete_many()方法传入的是一个空的查询对象,则会删除集合中的所有文档
rs4 = myDb.p02.delete_many({})
print(rs4.deleted_count, '个文档已被删除')
# 删除集合
myDb.p02.drop()
print('集合删除成功')

# 改
# update_one()修改一条文档中的记录,改方法第一个参数为查询的条件,第二个参数为要修改的字断;如果查到的匹配数据多于一条,则只会修改第一条
myClient2 = MongoClient("mongodb://localhost:27017")
myDb2 = myClient2.test
# 查看test库中的所有集合
myCollections = myDb2.list_collection_names()
print(myCollections)
# 隐式创建集合p02(直接插入文档数据)
mylist = [
    {"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"},
    {"name": "QQ", "alexa": "101", "url": "https://www.qq.com"},
    {"name": "Facebook", "alexa": "10", "url": "https://www.facebook.com"},
    {"name": "知乎", "alexa": "103", "url": "https://www.zhihu.com"},
    {"name": "Github", "alexa": "109", "url": "https://www.github.com"}
]
myDb2.p02.insert_many(mylist)
my_query = {"alexa": "10"}
newValues = {"$set": {"alexa": "1000"}}
myDb2.p02.update_one(my_query, newValues)
# 输出修改后的 'p02' 集合
for x in myDb2.p02.find():
    print(x)
# update_many(): 修改匹配到的所有记录
my_query2 = {"name": {"$regex": "^F"}}
newValues2 = {"$set": {"alexa": "10000000"}}
x = myDb2.p02.update_many(my_query2, newValues2)
print(x.modified_count, '文档已修改')

# 查
# find_one():查询集合中的一条数据
rs5 = myDb2.p02.find_one()
print(rs5)
# 查询集合中的所有数据
rs6 = myDb2.p02.find()
for r in rs6:
    print(r)
# 查询指定字段的数据, find() 方法来查询指定字段的数据,将要返回的字段对应值设置为 1
rs7 = myDb2.p02.find({}, {"_id": 0, "name": 1, "url": 1})
for r2 in rs7:
    print(r2)
# 根据指定的条件查询
my_query3 = {"name": "知乎"}
rs8 = myDb2.p02.find(my_query3)
for r3 in rs8:
    print(r3)
# 读取 name 字段中第一个字母 ASCII 值大于 "H" 的数据,大于的修饰符条件为 {"$gt": "H"} :
my_query4 = {"name": {"$gt": "H"}}
rs9 = myDb2.p02.find(my_query4)
for r4 in rs9:
    print(r4)
# 正则表达式查询,正则表达式修饰符只用于搜索字符串的字段
# 读取 name 字段中第一个字母为 "R" 的数据,正则表达式修饰符条件为 {"$regex": "^T"}
my_query5 = {"name": {"$regex": "^T"}}
rs10 = myDb2.p02.find(my_query5)
for r5 in rs10:
    print(r5)
# 返回指定条数记录
rs11 = myDb2.p02.find().limit(3)
for r6 in rs11:
    print(r6)

# 排序 sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序
rs11 = myDb2.p02.find().sort("alexa", -1)
for r7 in rs11:
    print(r7)

# 计数
counts = myDb2.p02.find().count()
print(counts)



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值