MongoDB 介绍mongodb 和大多数NoSQL 数据库(redis,memcached 等)一样,都是以 kv数据库(key/value) 存储数据不同的是mongodb 文档数据库,存储的是文档(Bson->json的二进制化).特点:内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作.mongo和传统型数据库相比,最大的不同:传统型数据库: 结构化数据, 定好了表结构后,每一行的内容,必是符合表结构的,就是说--列的个数,类型都一样.mongo文档型数据库: 表下的每篇文档,都可以有自己独特的结构(json对象都可以有自己独特的属性和值)问题: 如果有电影, 影评, 影评的回复, 回复的打分在传统型数据库中, 至少要4张表, 关联度非常复杂.在文档数据库中,通过1篇文档,即可完成. 体现出文档型数据库的反范式化{ fiim: ’天龙八部’ comment: [{ content: ’王家卫的电影风格’, reply: [‘支持’, ’好’] }]}mongodb的安装1: 下载mongodb www.mongodb.org 下载最新的stable版2: 解压文件3: 不用编译,本身就是编译后的二进制可执行文件4: 启动mongod服务./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017参数解释:--dbpath 数据存储目录--logpath 日志存储目录--port 运行端口(默认27017)--fork 后台进程运行5: mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,如果你用虚拟机练习,可能空间不够,导致无法启动.可以用 --smallfiles 选项来启动, 将会占用较小空间 400M左右.mongo入门命令1.1: show dbs 查看当前的数据库1.2 use databaseName 选库1.2 show tables/collections 查看当前库下的collection1.3 如何创建库?Mongodb的库是隐式创建,你可以use 一个不存在的库然后在该库下创建collection,即可创建库1.4 db.createCollection(‘collectionName’) 创建collection1.5 collection允许隐式创建 Db.collectionName.insert(document);1.6 db.collectionName.drop() ,删除collection1.7 db.dropDatabase(); 删除database基本操作增删改查增: insert介绍: mongodb存储的是文档,. 文档是json格式的对象.语法: db.collectionName.isnert(document);1: 增加单篇文档Db.collectionName.insert({title:’nice day’});2: 增加单个文档,并指定_idDb.collectionName.insert({_id:8,age:78,name:’lisi’});增加多个文档db.collectionName.insert([{time:'friday',study:'mongodb'},{_id:9,gender:'male',name:'QQ'}])删:remove语法: db.collection.remove(查询表达式, 选项);选项是指 {justOne:true/false},是否只删一行, 默认为false注意1: 查询表达式依然是个json对象2: 查询表达式匹配的行,将被删掉3: 如果不写查询表达式,collections中的所有文档将被删掉.例1: db.stu.remove({sn:’001’});删除stu表中 sn属性值为’001’的文档例2: db.stu.remove({gender:’m’,true});删除stu表中gender属性为m的文档,只删除1行改 update操作改谁? --- 查询表达式改成什么样? -- 新值 或 赋值表达式操作选项 ----- 可选参数语法: db.collection.update(查询表达式,新值,选项);例:db.news.update({name:'QQ'},{name:'MSN'});是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’},结果: 文档中的其他列也不见了,改后只有_id和name列了.即--新文档直接替换了旧文档,而不是修改如果是想修改文档的某列,可以用$set关键字db.collectionName.update(query,{$set:{name:’QQ’}})修改时的赋值表达式$set 修改某列的值$unset 删除某个列$rename 重命名某个列$inc 增长某个列$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段.Option的作用:{upsert:true/false,multi:true/false}Upsert---是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)例:db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true});如果有name=’wuyong’的文档,将被修改如果没有,将添加此新文档例:db.news.update({_id:99},{x:123,y:234},{upsert:true});没有_id=99的文档被修改,因此直接插入该文档multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)例:db.news.update({age:21},{$set:{age:22}},{multi:true});则把news中所有age=21的文档,都修改查: find, findOne语法: db.collection.find(查询表达式,查询的列);Db.collections.find(表达式,{列1:1,列2:1});例1:db.stu.find()查询所有文档 所有内容例2: db.stu.find({},{gendre:1})查询所有文档,的gender属性 (_id属性默认总是查出来)例3: db.stu.find({},{gender:1, _id:0})查询所有文档的gender属性,且不查询_id属性例3: db.stu.find({gender:’male’},{name:1,_id:0});查询所有gender属性值为male的文档中的name属性查询表达式:1: 最简单的查询表达式{filed:value} ,是指查询field列的值为value的文档2: $ne --- != 查询表达式{field:{$nq:value}}作用--查filed列的值 不等于 value 的文档3: $nin --> not in4: $all语法: {field:{$all:[v1,v2..]}}是指取出 field列是一个数组,且至少包含 v1,v2值5: $exists语法: {field:{$exists:1}}作用: 查询出含有field字段的文档6: $nor,{$nor,[条件1,条件2]}是指 所有条件都不满足的文档为真返回7:用正则表达式查询 以”诺基亚”开头的商品例:db.goods.find({goodsname:/诺基亚./},{goodsname:1});8: 用$where表达式来查询例: db.goods.find({$where:'this.catid != 3 && this.catid != 11'});注意: 用$where查询时, mongodb是把bson结构的二进制数据转换为json结构的对象,然后比较对象的属性是否满足表达式.速度较慢Update时可用的操作符例:->db.user.insert({name:'lisi',age:12,sex:'male',height:123,area:'haidian'});->db.user.update({name:'lisi'},{$set:{area:'chaoyang'},$unset:{height:1},$inc:{age:1},$rename:{sex:'gender'}});db.user.find();{ "_id" : ObjectId("51fc01c4f5de93e1f2856e33"), "age" : 13, "area" : "chaoyang", "gender" : "male", "name" : "lisi" }$setOnInsert ->相当于mysql中的列的默认值
MongoDB 介绍
mongodb 和大多数NoSQL 数据库(redis,memcached 等)一样,都是以 kv数据库(key/value) 存储数据
不同的是mongodb 文档数据库,存储的是文档(Bson->json的二进制化).
特点:内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作.
mongo和传统型数据库相比,最大的不同:传统型数据库: 结构化数据, 定好了表结构后,每一行的内容,必是符合表结构的,就是说--列的个数,类型都一样.mongo文档型数据库: 表下的每篇文档,都可以有自己独特的结构(json对象都可以有自己独特的属性和值)
问题: 如果有电影, 影评, 影评的回复, 回复的打分在传统型数据库中, 至少要4张表, 关联度非常复杂.在文档数据库中,通过1篇文档,即可完成. 体现出文档型数据库的反范式化
mongodb的安装
1: 下载mongodb www.mongodb.org 下载最新的stable版
2: 解压文件
3: 不用编译,本身就是编译后的二进制可执行文件
4: 启动mongod服务
./bin/mongod --dbpath /path/to/database --logpath /path/to/log --fork --port 27017
参数解释:
--dbpath 数据存储目录
--logpath 日志存储目录
--port 运行端口(默认27017)
--fork 后台进程运行
5: mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,
如果你用虚拟机练习,可能空间不够,导致无法启动.
可以用 --smallfiles 选项来启动,
将会占用较小空间 400M左右.
mongo入门命令
1.1: show dbs 查看当前的数据库
1.2 use databaseName 选库
1.2 show tables/collections 查看当前库下的collection
1.3 如何创建库?
Mongodb的库是隐式创建,你可以use 一个不存在的库
然后在该库下创建collection,即可创建库
1.4 db.createCollection(‘collectionName’) 创建collection
1.5 collection允许隐式创建 Db.collectionName.insert(document);
1.6 db.collectionName.drop() ,删除collection
1.7 db.dropDatabase(); 删除database
基本操作增删改查
增: insert
介绍: mongodb存储的是文档,. 文档是json格式的对象.
语法: db.collectionName.isnert(document);
1: 增加单篇文档
2: 增加单个文档,并指定_id
删:remove
语法: db.collection.remove(查询表达式, 选项);
选项是指 {justOne:true/false},是否只删一行, 默认为false
注意
1: 查询表达式依然是个json对象
2: 查询表达式匹配的行,将被删掉
3: 如果不写查询表达式,collections中的所有文档将被删掉.
例1:
例2:
改 update操作
改谁? --- 查询表达式改成什么样?
语法:
db.collection.update(查询表达式,新值,选项);
例:
db.news.update({name:'QQ'},{name:'MSN'});是指选中news表中,name值为QQ的文档,并把其文档值改为{name:’MSN’},
结果: 文档中的其他列也不见了,改后只有_id和name列了.即--新文档直接替换了旧文档,而不是修改
如果是想修改文档的某列,可以用$set关键字
修改时的赋值表达式$set 修改某列的值$unset 删除某个列$rename 重命名某个列$inc 增长某个列$setOnInsert 当upsert为true时,并且发生了insert操作时,可以补充的字段.
Option的作用:
{upsert:true/false,multi:true/false}Upsert---是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)
例:
如果有name=’wuyong’的文档,将被修改如果没有,将添加此新文档
例:
没有_id=99的文档被修改,因此直接插入该文档
multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)例:
db.news.update({age:21},{$set:{age:22}},{multi:true});则把news中所有age=21的文档,都修改
查: find, findOne
语法: db.collection.find(查询表达式,查询的列);Db.collections.find(表达式,{列1:1,列2:1});
例1:db.stu.find()查询所有文档 所有内容
例2: db.stu.find({},{gendre:1})查询所有文档,的gender属性 (_id属性默认总是查出来)
例3: db.stu.find({},{gender:1, _id:0})查询所有文档的gender属性,且不查询_id属性
例3: db.stu.find({gender:’male’},{name:1,_id:0});查询所有gender属性值为male的文档中的name属性
查询表达式:
1: 最简单的查询表达式{filed:value} ,是指查询field列的值为value的文档
2: $ne --- != 查询表达式{field:{$nq:value}}作用--查filed列的值 不等于 value 的文档
3: $nin --> not in
4: $all语法: {field:{$all:[v1,v2..]}}是指取出 field列是一个数组,且至少包含 v1,v2值
5: $exists语法: {field:{$exists:1}}作用: 查询出含有field字段的文档
6: $nor,{$nor,[条件1,条件2]}是指 所有条件都不满足的文档为真返回
7:用正则表达式查询 以”诺基亚”开头的商品例:db.goods.find({goodsname:/诺基亚./},{goodsname:1});
8: 用$where表达式来查询例: db.goods.find({$where:'this.catid != 3 && this.catid != 11'});
注意: 用$where查询时, mongodb是把bson结构的二进制数据转换为json结构的对象,然后比较对象的属性是否满足表达式.
速度较慢
Update时可用的操作符例:->db.user.insert({name:'lisi',age:12,sex:'male',height:123,area:'haidian'});->db.user.update({name:'lisi'},{$set:{area:'chaoyang'},$unset:{height:1},$inc:{age:1},$rename:{sex:'gender'}});
db.user.find();
{ "_id" : ObjectId("51fc01c4f5de93e1f2856e33"), "age" : 13, "area" : "chaoyang", "gender" : "male", "name" : "lisi" }
$setOnInsert ->相当于mysql中的列的默认值