MongoDB
"""
定义:基于分布式文件存储的Nosql数据库
优势:
1、无数据结构限制
2、冗余和扩展(复制集保障数据安全 + 分片扩展数据集合)
3、良好支持 (完善的文档 + 齐全的驱动支持
"""
# **运行MongoDB- 服务端** (默认端口 27017)
mongod --dbpath "D:\MongoDB\data" # D:\MongoDB\data 安装目录
# 开启客户端
mongod
# **MongoDB- 概念介绍**
database # 数据库
collection # 数据库表/集合 (类似于 sql 中的table)
document # 数据记录行/文档 (类似于 sql 中 row)
field # 字段/域 (类似于sql中 column)
index # 索引
primary key # 主键
# **MongoDB - 元素**
# 数据库、集合、文档(关系型数据库中的一行)
# **基本使用**
show dbs # 查看数据库
use "数据库名称" # 切换数据库/若没有则创建数据库
db # 查看当前数据库
db.dropDatabse() # 数据数据库
show tables / show collections # 查看集合
db.shutdownServer() # 退出数据库
# **创建集合**
db.createCollection(name,options) # name:集合名称, options:可选参数,指定有关内存大小及索引的选项
db.createCollection('sub',{capped:true,size:10}) # capped 是否设置上限,size 存数据上限、
show collections # 显示当前数据中的所有集合
# 删除数据库
db."数据库名称".drop()
# **数据类型**
String # 字符串 UTF-8
Boolean #布尔类型
Integer # 整数,位数取决于服务器
Double # 存储浮点数
Arrays # 数组 或 列表
Object # 嵌入式文档
Null # 存储null值
Timestamp # 时间戳
Object ID # 12个字节的 十六进制数
# 前4个字节当前时间戳
# 3个字节 机器ID
# 2个字节 MongoDB 服务进程 id
# 最后 3个字节,简单增量值
增删改查
# 一个表称为一个集合
# 数据插入 数据格式为json,id不能重复、支持多 条插入数据库
db."集合名".insert( {} )
db.lcl_table.insert({name:lcl}) # 插入数据 name :lcl / _id 制定主键
db.lcl-table.find() # 查看表中所有
# 多条插入
for(i=3;i<10;i++)db.lcl_table.insert({name : i})
# 数据更新 / 如果没有的情况下直接插入
db.lcl_table.save({_id:1,name:wzh}) # 将id 为1 的数据更新为 wzh
# 查询数据
db.lcl-table.find() # 查看集合中的 所有数据
db.lcl-table.find().pretty # pretty 对查询的内容进行格式化
db.lcl-table.findOne() # 查询一条
db.lcl-table.find().count() # 总条数
db.lcl-table.find("查询条件").limit(2) # 查询前2条数据
db.lcl-table.find().skip(2) # 跳过前2条
db.lcl-table.find(book:{{$all:{"mogo","php"}}}) # book字段对应的列表种同时含有mogo,和php
db.lcl-table.find({"books.1":"java"}) # book 中第二本为java
db.lcl-table.find({books:{$size:4}}) # books 里面有 4 本书
db.lcl-table.distinct("county") # 返回不重复的国家
db.lcl-table.find().skip(2).limit(2) # 可以做分页功能
# 数据的查询映射
# 查询所有,按要求返回字段
db.lcl-table.find({},{_id:1}). # 只显示id字段 (1 为显示该字段 )(0 为返回其他字段)
db.lcl-table.find().sort(name : 1) # 按name字段升序排列
db.lcl-table.find().sort(name :-1) # 按 name字段降序排列
# 运算符
$lt # 小于
$lte # 小于等于
$gt # 大于
$gte # 大于等于
db.lcl-table.find(y :($gte:18)) # 找 y 大于等于 18的值
# 范围运算符
db.lcl-table.find(y :{$in:[3,7]}) # 等于 3 或 7
db.lcl-table.find(y :{$nin:[3,7]}) # 不等于 3 或 7,取反
db.lcl-table.find({$or:[{age:18},{x:4}]}) # or的条件
# 修改数据
db.lcl-table.update({x:100},{y:99}) # 将 x =100 的 所有数据 替换成 y = 99 整条数据更新
db.lcl-table.update({x:100},{$set:{y:99}}) # 将 x =100 数据中 y的部分更新为y = 99
db.lcl-table.update({x:100},{$set:{y:99}},{multi:true}) # 更新多条
db.lcl-table.remove({x:100}) # 按条件删除 {x :100}
聚合
$group # 分组统计
$match # 过滤数据,输出符合条件的文档
$project #
# 根据 gender分组,各组中年龄的总和
db,stu.aggregate(
{$group:{_id:'$gender',count:{$sum:"$age"}}}
)
# 查询年龄大于20的学生
db,stu.aggregate(
{$match:{age:{$gt:20}}}
)
# 查询年龄大于20的男生和女生人数(先过滤再分组)
db,stu.aggregate(
{$match:{age:{$gt:20}}}
{$group:{_id:'$gender',count:{$sum:1}}}
)
MongoDB与python交互
# 交互模块安装
pip install pymongo
# 连接
from pymongo import MongoClient
class MongoDB(object):
def __init__(self):
# 连接 test集合
self.client = MongoClient(host="localhost",port = 27017)
# self.client = MongoClient("mongodb://127.0.0.1:27017/")
self.db = self.client['test']['demo']
# 添加单条数据
def add_one(self,data):
self.db.demo.insert_one()
# 添加多条
def add_many(self,data):
self.db.demo.insert_many()
# 获取一条数据
def get_one(self):
return self.db.demo.find_one()
# 获取多条
def get_many(self,query):
return self.db.demo.find(query)
if __name__=='__main__'
mdb = MongoDB()
data={"title":"python","content":"lcl"}
mdb.add_one(data)
data=[ {"title":"python","content":"lcl"}
{"title":"php","content":"lcl"}]
mdb.add_many(data)
query = {"title":"python","content":"lcl"}
results = get_many(query)
for data in result:
print(data)