传统的数据存储都是基于关系数据库管理系统(RDBMS)进行管理,随着web应用数据量的爆炸式增长对高并发和查找效率提出更高的要求,而传统的数据库注重数据关系的构建缺乏灵活性在一些场合下效率较低,如在部分商品应用中添加字段需要对整个表已有的数据进行操作资源消耗极大,若重新建表来专表专用使后期管理变得复杂。现在互联网上的数据产生快且形态各异,NoSQL(No Only SQL)应运而生解决超大规模无固定模式数据的存储。其中MongoDB作为文档型数据库的典型代表,是一个基于分布式文件存储的开源数据库系统旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB的基本结构:MongoDB由数据库、集合和文档三级结构构成,对应SQL中的数据库、表、记录,一个集合包含多个文档对象,文档对象以JSON格式写成。
开始MongoDB
- 设置MongoDB数据库的存储路径 mongod -- dbpath E:\data\db(需要提前建好)
- 启动MongoDB服务器:mongod
启动后会在数据库存储位置(E:\data\db)产生一系列文件,不要手动修改 - 修改默认端口:mongod --port 27017(默认)
- 链接MongoDB数据库:mongo
- 查看所有数据库:show dbs
- 切换到指定数据库:use xxx
- 查看当前操作的数据库:db
- 查看当前数据库中所有的集合:show collections
当数据库和集合名不存在时,可以直接操作自动生成
数据库的CRUD操作
增加文档
# 插入一条数据自动生成_id属性
db.collectionName.insertOne( {} )
# 插入多条数据用数组包裹
db.collectionName.insertMany( [ {} , {} ] )
查询数据
# 查询一个文档,返回一个文档对象
db.collectionName.findOne({条件})
# 查询多个对象,返回以数组组织的多个文档对象
db.collectionName.find({})
# 内嵌文档某一项作为查询条件用.进行索引,查询key需要用“”
{
name:'liu',
hobby:{
movies:['movie1','movie2'],
cities:['zhuhai','chengdu']
}
}
db.users.find({"hobby.movies":'movie1'})
查询操作符
当查询的某一属性是在一个范围内的文档,可以用mongo提供的比较操作符
#查询操作符的使用
#比较操作符
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$eq 等于的另一种写法
db.users.find({num:{$gt:200}}) #大于200
db.users.find({num:{$gt:200,$lt:300}}) #大于200小于300
$or 或者
db.users.find(
{
$or:[
{num:{$gt:300}},
{num:{$lt:200}}
]
}
) #大于300或小于200
限制条数和分页
限定展示N条出来的查找结果条数可以用limit(N)函数,跳过前N条结果可以用skip(N)函数,利用这两个函数便可以实现搜索引擎中分页展示的功能。
db.users.find().skip(页码-1 * 每页显示的条数).limit(每页显示的条数)
db.users.find().limit(10) #前10条数据
db.users.find().skip(50).limit(10) #跳过前50条数据,即查询的是第61-70条数据,即第6页的数据
结果排序
未指定排序键的时候默认用主键排序,可以将查询结果以某一特殊键进行排序。
db.emp.find().sort({sal:1}) #1表示升序排列,-1表示降序排列
db.emp.find().sort({sal:1,empno:-1}) #先按照sal升序排列,如果遇到相同的sal,则按empno降序排列
注意:skip,limit,sort可以以任意的顺序调用,最终的结果都是先调sort,再调skip,最后调limit
投影展示
查询到的结果都会以整个文档进行显示,可以选取某几个字段显示,_id字段默认显示。
db.emp.find({},{ename:1,_id:0})#在匹配到的文档中只显示ename字段
修改数据
利用修改操作符针对满足某一条件的文档的部分属性进行修改,常用的操作符有unset,addToSet,不加修改操作符则会直接索引新对象。
# 1.替换整个文档
# db.collectionName.update(condiction,newDocument)
> db.students.update({_id:'222'},{name:'kang'})
# 2.修改对应的属性,需要用到修改操作符,比如$set,$unset,$push,$addToSet
db.collectionName.update(
# 查询条件
{_id:222},
{
#修改对应的属性
$set:{
name:'kang2',
age:21
}
#删除对应的属性
$unset:{
gender:1 //这里的1可以随便改为其他的值,无影响
}
}
)
# 3.update默认与updateOne()等效,即对于匹配到的文档只更改其中的第一个
# updateMany()可以用来更改匹配到的所有文档
db.students.updateMany(
{name:'liu'},
{
$set:{
age:21,
gender:222
}
}
)
# 4.向数组中添加数据
db.users.update({username:'liu'},{$push:{"hobby.movies":'movie4'}})
#如果数据已经存在,则不会添加
db.users.update({username:'liu'},{$addToSet:{"hobby.movies":'movie4'}})
# 5.自增自减操作符$inc
{$inc:{num:100}} #让num自增100
{$inc:{num:-100}} #让num自减100
db.emp.updateMany({sal:{$lt:1000}},{$inc:{sal:400}}) #给工资低于1000的员工增加400的工资
删除文档
# 删除文档
db.collectionName.deleteOne()
db.collectionName.deleteMany()
# 删除集合
db.collection.drop()
# 删除数据库
db.dropDatabase()
pymongo
pymongo是Python用于操控MongoDB的库,将MongoDB的操作指令进行函数封装,函数名是指令名按单词用_隔开。
import pymongo
#创建链接
client = pymongo.MongoClient('localhost',27017)
# 创建数据库(存在则选用)
book_weather = client['weather']
# 创建集合(存在则选用)
sheet_weather = book_weather['sheet_weather_1']
更多操作可以详见开发文档
网友评论