数据库之Mongodb
- 特点
c++编写,分布式文件数据库,键值存储,易扩展
默认端口:27107
键值的值支持几乎所有的数据类型:数字,字符串,列表,时间,空null,字典
- 与关系性数据库的区别
表 ---> collection 集合
列 ---> field 字段
行 ---> document 文档
主键 ---> _id
-
mongodb思想:使用了一个不存在的对象,即没有创建该对象时可直接用,当添加了数据就自动创建了
- 常用命令
$ mongo # shell环境进入mongo
show dbs:显示数据库列表
show collections:显示当前数据库中的集合(类似关系数据库中的表table)
show users:显示所有用户
use yourDB:切换当前数据库至yourDB
db :查看当前库
db.dropDatabase() :删库
db.help() :显示数据库操作命令
db.yourCollection.help() :显示集合操作命令,yourCollection是集合名
MongoDB没有创建数据库的命令,如果你想创建一个“School”的数据库,先运行use School命令,之后做一些操作(如:创建聚集集合db.createCollection('teacher')),这样就可以创建一个名叫“School”的数据库
- 为某个库创建用户
> use my_mongo
switched to db my_mongo
> db.createUser(
... {
... user:'python',
... pwd:'123456',
... roles:[{role:'readWrite',db:'my_mongo'},{role:'read',db:'test'}]
... }
... )
- 登录
#注意使用双引号而非单引号
mongo --port 27017 -u "root" -p "123" --authenticationDatabase "admin"
# 或
mongo
use admin
db.auth("root","123")
- python操作mongodb
from pymongo import MongoClient
# 创建连接
mo_cli = MongoClient('mongodb://python:123456@localhost:27017/my_mongo')
# 连接到数据库
db = mo_cli.my_mongo
# 获取数据库中所有的集合
collist = db.collection_names(include_system_collections=False)
# 创建集合
table_dep = db.dep
# 增
# 向集合中插入数据
table_dep.insert_one({'name': '商务部'})
# 插入多条
li = [{"name": "Taobao", "alexa": "100", "url": "https://www.taobao.com"},
{"name": "QQ", "alexa": "101", "url": "https://www.qq.com"},
{"name": "Github", "alexa": "109", "url": "https://www.github.com"}]
table_dep.insert_many(li)
# 查
# 根据条件查询 : db.db_name.col_name.find({"条件"}) 条件为空查询所有
# 查询单条直接返回值
res = table_dep.find_one({'name': 'QQ'})
# 查询多条需要for循环
ret = table_dep.find({'name': 'QQ'})
print(ret, type(ret)) # <pymongo.cursor.Cursor object at 0x7f557d6e9f60> <class 'pymongo.cursor.Cursor'>
for i in ret:
print(i)
# 改
# 更新 update({条件},{待修改关键字})
table_dep.update_one({'alexa': {'$gte': 109}}, {"$set":{'name': 'xxxxxxx'}})
table_dep.update_many({'alexa': {'$gte': 109}}, {"$set":{'name': 'xxxxxxx'}})
table_dep.save({'name':888888}) # 直接存,如果有相同的name则覆盖
# 删
table_dep.remove({'alexa': "100"}) # 指定条件删除,如果不指定则清空集合
# 关键字$及$修改器 $set $inc $push $pull $pop
# $ 代表的是下标,位置
db.table.update_one({"score":30}, {"$set":{"test_list.0":9}}) # 修改满足条件的,列表索引为0的元素为9
&
db.table.update_one({"score":30,"test_list":2}, {"$set":{"test_list.$":9}}) # 将列表元素为2的改为9
# 表较运算符 $gt\$lt\$gte\$lte等
db.table_name.find_one({"score":{"$gt": 80}}) # 获取分数大于80的
# 自动自增$inc
db.table_name.update_one({"score":59}, {"$inc":{"score":1}}) # 为分数为59的,增加1分
#删除字典中一个键值$unset
db.table_name.update_one({"name":"qq"}, {"$unset":{"age":30}}) # 将名字为qq的age键值删掉,相当于删除字段
# 向列表 尾部 中添加元素$push
db.table_name.update_one({}, {"$set":{"china_list":[11,22,33]}}) # 向原有数据的字典中添加一个数组字段
db.table_name.update_one({"name":"xiu"}, {"$push":{"china_list":77}}) # 向name为xiu的字段china_list中尾部添加一个元素77
# 从列表中删除用$pull
db.table_name.update_many({"name":"xiu"}, {"$pull":{"china_list":77}}) # 将所有满足条件的列表中77元素删除
# 指定位置删除 $pop
db.table_name.update_many({"name":"xiu"}, {"$pop":{"china_list":1}}) # 1表示最后一个,-1表示第一个
# 聚合操作:筛选($match)、投射($project)、分组($group)、排序($sort)、限制($limit)、跳过($skip)
db.emp.aggregate({"$group":{"_id":$分组字段, "新的字段名":聚合操作符}})
# 查每个用户,关联了多少项目
db.emp.aggregate([{$group : {_id : "$by_user", pro_num_count : {$sum : 1}}}])