1.nosql(被应用与互联网领域)
NoSQL(Not OnlySQL ),意即“不仅仅是SQL” ,指的是非关系型的数据库 。是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
关系型数据库中的表都是存储一些结构化的数据,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。而 非关系型数据库以键值对(key-value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。
2.nosql优缺点
在优势方面主要体现在下面几点:
简单的扩展
快速的读写
低廉的成本
灵活的数据模型
在不足方面主要有下面几点:
不提供对SQL的支持
支持的特性不够丰富
现有的产品不够成熟
3.Mongodb简介
MongoDB是用 C++语言编写的非关系型数据库。特点是 高性能、易部署、易使用,存储数据十分方便,主要特性有:
面向集合存储, 易于存储对象类型的数据(mongodb中使用json redis中使用hash)
模式自由
支持动态查询
支持完全索引,包含内部对象
支持复制和故障恢复
使用高效的二进制数据存储,包括大型对象
文件存储格式为 BSON( 一种 JSON 的扩展 )
4.非关系型数据库与关系型数据库的对比
5.Mongodb基本概念
文档(document)是MongoDB中数据的基本单元, 非常类似于关系型数据库系统中的行(但是比行要复杂的多)
集合(collection)就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么 集合就如同表
MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限
MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据作用非常大(可以编写js脚本)
每一个文档都有一个特殊的键"_id"(不指定时有mongodb自己维护),它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键
mongodb基本类型
数据类型 描述 举例
null 表示空值或者未定义的对象 {"x":null}
布尔值 真或者假:true或者false {"x":true}
32位整数 32位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数
64位整数 64位整数。shell是不支持该类型的,shell中默认会转换成64位浮点数
64位浮点数 64位浮点数。shell中的数字就是这一种类型 {"x":3.14,"y":3}
字符串 UTF-8字符串 {"foo":"bar"}
符号 shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串
对象id 文档的12字节的唯一id {"id": ObjectId()}
日期 从标准纪元开始的毫秒数 {"date":new Date()}
正则表达式 文档中可以包含正则表达式,遵循JavaScript的语法 {"foo":/foobar/i}
代码 文档中可以包含JavaScript代码 {"x":function() {}}
未定义 undefined {"x":undefined}
数组 值的集合或者列表 {"arr": ["a","b"]}
内嵌文档 文档可以作为文档中某个key的value {"x":{"foo":"bar"}}
6.Mongodb常用操作
• 创建或切换数据库(有就切换没有就创建),使用命令 use 数据库名称 ,如:
use db1
• 删除当前数据库,使用命令
db.dropDatabase()
• 查看所有数据库,使用命令
show dbs
• 查看当前所在数据库,使用命令
db
• 查看当前数据库中所有的集合,使用命令
show collections
show tables
• 创建集合有两种方式,显示创建和隐式创建
显示创建可以使用命令
db.createCollection(“ 集合名称 ")
隐式创建可以使用命令
db. 集合名称 .insert({}), 指创建集合并同时向集合中插入数据 , 例如: db.customer.insert({name:”jack”})
• 向集合添加文档,使用命令 db.集合名称.insert({}),例如:
db.user1.insert({name:”jack”,age:20})
• 删除集合中的文档,使用命令 db.集合名称.remove({删除条件})
不加删除条件为删除集合中的所有文档
db.c1.remove({}) 为删除 c1 集合中的所有文档
删除c1集合中name为user1的文档
db.c1.remove({name:”user1”})
• 查询集合中的文档,可以使用命令 db.集合名称.find({条件}),或者使用 db.集合名称.findOne() 查询第一个文档
for(var i=0;i<100;i++){
db.coll02.insert({name:"zhangsan"+i,age:18})
}
db.coll02.find()
db.coll02.findOne()
• 查询集合中的文档,返回某些特定的键值
db.coll02.find({ 条件 },{ 显示或隐藏的字段 })
查询coll02集合返回结果中不包含age字段(0不包含,1包含)
db.coll02.find({},{age:0})
查询coll02集合返回结果中包含age和name字段
db.coll02.find({},{age:1,name:1})
• 查询集合中的文档 ,使用条件表达式(<, <=, >, >=,!=)
插入测试数据
for(vari=10;i<100;i++){
db.coll03.insert({name:"zhangsan"+i,age:i})
}
//大于: age > 50
db.coll03.find({age:{$gt:50}})
//小于: age < 20
db.coll03.find({age:{$lt:20}})
//大于等于: age >=10
db.coll03.find({age:{$gte:10}})
//小于等于: age <= 60
db.coll03.find({age:{$lte:60}})
//不等于: age!= 10
db.coll03.find({age:{$ne:10}})
• 查询集合中的文档 ,统计(count)、排序(sort)、分页(skip、limit)
db.coll03.count()
db.coll03.find().count()
db.coll03.find({age:{$gt:50}}).count()
db.coll03.find().sort({age:-1})
db.coll03.find().sort({age:-1}).skip(10).limit(20)
db.coll03.find().sort({age:1}).skip(10).limit(20)
db.coll03.find().sort({age:-1}).skip(10).limit(20).count(0)
b.coll03.find().sort({age:1}).skip(10).limit(20).count(1)
• 查询集合中的文档 ,$all主要用来查询数组中的包含关系,查询条件中只要有一个不包含就不返回
db.coll04.insert({name:"person",age:[60,70,80,90,100]})
db.coll04.insert({name:"wugui",age:[80,90,100,110,120,130,140]})
db.coll04.insert({name:"anmial",age:[10,20,30,80]})
db.coll04.find({age:{$all:[80,90]}})
• 查询集合中的文档 ,$in,类似于关系型数据库中的IN
db.coll04.find({age:{$in:[30,70,140]}})
• 查询集合中的文档 ,$nin,与$in相反
db.coll04.find({age:{$nin:[70,140]}})
• 查询集合中的文档 ,$or,相当于关系型数据库中的OR,表示或者的关系,例如查询age中有70的或name是wugui的的文档,命令为:
db.coll04.find({$or:[{age:{$in:[70]}},{name:"wugui"}]})
db.coll03.find({$or:[{name:"zhangsan66"},{name:"zhangsan88"}]})
• 查询集合中的文档 ,$nor,表示 根据条件过滤掉某些数据,例如查询name不是user2,age不是3的文档,命令为:
db.coll03.find({$nor:[{name:"zhangsan66"},{name:"zhangsan88"}]})
• 查询集合中的文档 ,$exists,用于查询集合中存在某个键的文档或不存在某个键的文档
$exists:1表示真,指存在
$exists:0表示假,指不存在
db.coll03.insert({name:"lisi",age:99,love:"eat"})
db.coll03.find({name:{$exists:0}})
db.coll03.find({name:{$exists:1}})
db.coll03.find({love:{$exists:1}})
db.coll03.find({love:{$exists:0}})
• 查询集合中的文档 ,类似于关系型数据库,mongodb中也有游标的概念
//Mongodb 游标概念
var coll03Var=db.coll03.find();
coll03Var.hasNext()
coll03Var.next()
• 更新集合中的文档,语法如下:
db.collection.update(criteria,objNew,upsert,multi)
参数说明:
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1
multi:如果有多个符合条件的记录,是否全部更新,取值为0或1
注意:默认情况下,只会更新第一个符合条件的记录
一般情况下后两个参数分别为0,1 ,即:
db.collection.update(criteria,objNew,0,1)
• 更新集合中的文档,将集合中name为user1的文档改成name为jack
age会覆盖name为lisi4的文档
db.coll04.update({name:"lisi4"},{age:88},0,1)
• 更新集合中的文档, $set 用来指定一个键的值,如果这个键不存在,则创建它。例如:
$set只更新文档中的age字段其他字段不变
db.coll04.update({name:"lisi4"},{$set:{age:88}},0,1)
db.coll04.update({name:"lisi5"},{$set:{age:88}},1,1)
db.coll05.update({name:"lisi4"},{$set:{birthday:newDate()}},1,1)
• 更新集合中的文档,使用 $inc 将集合中name为user1的age加1,其它键不变, $inc表示使某个键值加减指定的数值
db.coll05.update({name:"lisi4"},{$inc:{age:10}})
• 更新集合中的文档,可以使用命令
db.coll05.update({name:"lisi4"},{$unset:{love:-1}})
use db01
show dbs
db.dropDatabase()
show collections
show tables
//显示创建集合
db.createCollection("coll01")
//隐式创建集合
db.coll02.insert({name:"zhangsan",age:18})
//coll01插入100条记录
for(var i=0;i<100;i++){
db.coll01.insert({name:"zhangsan"+i,age:18})
}
//删除coll01 name=zhangsan0
db.coll01.remove({name:"zhangsan0"})
//删除所有
db.coll01.remove({})
db.coll01.find().count()
db.coll02.find().count()
db.coll02.findOne()
db.coll02.find({},{age:0})
db.coll02.find({},{age:1,name:1})
for(var i=10;i<100;i++){
db.coll03.insert({name:"zhangsan"+i,age:i})
}
//比较运算符
db.coll03.find({age:{$gt:50}}).count()
db.coll03.find({age:{$lt:20}}).count()
db.coll03.find({age:{$gte:30}}).count()
db.coll03.find({age:{$lte:10}}).count()
db.coll03.find({age:{$ne:10}}).count()
//分页 统计(count)、排序(sort)、分页(skip、limit)
db.coll03.count()
db.coll03.find().count()
db.coll03.find({age:{$gt:50}}).count()
db.coll03.find().sort({age:-1})
db.coll03.find().sort({age:-1}).skip(10).limit(20)
db.coll03.find().sort({age:1}).skip(10).limit(20)
db.coll03.find().sort({age:-1}).skip(10).limit(20).count(0)
db.coll03.find().sort({age:1}).skip(10).limit(20).count(1)
//$all
db.coll04.insert({name:"person",age:[60,70,80,90,100]})
db.coll04.insert({name:"wugui",age:[80,90,100,110,120,130,140]})
db.coll04.insert({name:"anmial",age:[10,20,30,80]})
db.coll04.find({age:{$all:[80,90]}})
//$in
db.coll04.find({age:{$in:[30,70,140]}})
//$nin
db.coll04.find({age:{$nin:[70,140]}})
//$or $nor
db.coll04.find({$or:[{age:{$in:[70]}},{name:"wugui"}]})
db.coll03.find({$nor:[{name:"zhangsan66"},{name:"zhangsan88"}]}).count()
//$exists
db.coll03.insert({name:"lisi",age:99,love:"eat"})
db.coll03.find({name:{$exists:0}})
db.coll03.find({name:{$exists:1}})
db.coll03.find({love:{$exists:1}})
db.coll03.find({love:{$exists:0}})
//Mongodb游标概念
var coll03Var=db.coll03.find();
coll03Var.hasNext()
coll03Var.next()
//update
for(var i=0;i<5;i++){
db.coll05.insert({name:"lisi"+i,age:20+i,love:"study"});
}
db.coll05.find()
db.coll05.update({name:"lisi1"},{age:88})
db.coll05.update({name:"lisi5"},{$set:{age:88}},1,1)
db.coll05.update({name:"lisi4"},{$set:{birthday:new Date()}},1,1)
db.coll05.update({name:"lisi4"},{$inc:{age:10}})
db.coll05.update({name:"lisi4"},{$unset:{love:-1}})
//索引创建
db.coll03.ensureIndex({name:1})
db.coll03.dropIndex("name_1")
db.coll03.stats()
db.coll03.find({key:1}).explain()
7.索引
• 创建普通索引,使用命令
db.collection.ensureIndex({key:1})
• 查看关于索引的相关信息,使用命令
db.collection.stats()
• 查看查询使用索引的情况,使用命令
db.collection.find({key:value}).explain()
• 删除索引,使用命令
db.collection.dropIndex({key:1})
• 删除集合,也会将集合中的索引全部删除
• 创建唯一索引,使用命令
db.collection.ensureIndex({key:1} , {unique:true})
MongoDB常用密令(二)
最新推荐文章于 2022-12-12 22:08:05 发布