数据库之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_mongoswitched 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"# 或mongouse admindb.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的# 自动自增$incdb.table_name.update_one({"score":59}, {"$inc":{"score":1}}) # 为分数为59的,增加1分#删除字典中一个键值$unsetdb.table_name.update_one({"name":"qq"}, {"$unset":{"age":30}}) # 将名字为qq的age键值删掉,相当于删除字段# 向列表 尾部 中添加元素$pushdb.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# 从列表中删除用$pulldb.table_name.update_many({"name":"xiu"}, {"$pull":{"china_list":77}}) # 将所有满足条件的列表中77元素删除# 指定位置删除 $popdb.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}}}])