mongodb基本操作方法

3/7/2017来源:SQL技巧人气:2979

一、mongodb简介

mongodb属于文档型数据库,储存的是文档(Bson->json的二进制化)。我们熟知的MySQL数据库,它的数据是以表的形式储存的,每条记录都具有相同的结构,这样使得查询起来很方便,但是却增加了空间的压力;文档型数据库如mongodb,其数据是以一条条文本的形式储存,每条数据不需要有相同的结构,这使得具有了良好的灵活性。同时,假如有书籍、书评、书评的回复等信息,如果将这些信息储存在传统型数据库如MYSQL中,至少需要张表,关联度极其复杂,然而在如mongodb的文档型数据库中,用户只需要将其写在同一个文档中即可。mongodb内部执行引擎为JS解释器, 把文档存储成bson结构,在查询时,转换为JS对象,并可以通过熟悉的js语法来操作,对于熟悉JS的道友来说,mongodb是一个值得选择的数据库

二、mongodb安装


1.下载mongodb (https://www.mongodb.org ) 2.解压文件 3.不用编译,本身就是编译后的二进制可执行文件。 "alt mongodb 文件夹介绍" 4.启动mongod服务 进入mongodb的bin目录下,在命令行键入: mongod --dbpath=e:/mongodb/data --logpath=e:/mongodb/log1.log --fork --port=27017 参数解释: mongod 表名你要执行的操作命令类型,有时候mongod命令无效,这时候使用mongod.exe即可

--dbpath 数据存储目录 --logpath 日志存储目录 --fork 运行端口(默认27017) --port 后台程序运行
注:只有开启了mongo服务才可以进行数据库操作,开启服务后只需要键入mongo就可以进入mongodb操作面板

5.mongodb非常的占磁盘空间, 刚启动后要占3-4G左右,如果你用虚拟机练习,可能空间不够,导致无法启动.可以用 –smallfiles 选项来启动,将会占用较小空间 400M左右.

三、mongo入门命令

1.基本操作 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

2.基本操作增删改查 2..增: insert 介绍: mongodb存储的是文档,. 文档是json格式的对象.

语法: db.collectionName.isnert(document);

2.2: 增加单篇文档 Db.collectionName.insert({title:’nice day’});

2.3: 增加单个文档,并指定_id Db.collectionName.insert({_id:8,age:78,name:’lisi’});

2.4.增加多个文档

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行.

3.update 改 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操作时,可以补充的字段.

4.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属性

5.查询表达式:

5.1: 最简单的查询表达式 {filed:value},是指查询field列的值为value的文档

5.2: $ne --- != 查询表达式 {field:{$nq:value}} 作用–查filed列的值 不等于 value 的文档

5.3: $nin --> not in

5.4: $all 语法: {field:{$all:[v1,v2..]}} 是指取出 field列是一个数组,且至少包含 v1,v2值

5.5: $exists 语法: {field:{$exists:1}} 作用: 查询出含有field字段的文档

5.6: $nor {$nor,[条件1,条件2]} 是指 所有条件都不满足的文档为真返回

5.7:用正则表达式查询 以”诺基亚”开头的商品 例:db.goods.find({goods_name:/诺基亚.*/},{goods_name:1});

5.8: 用$where表达式来查询 例: db.goods.find({$where:'this.cat_id != 3 && this.cat_id != 11'});

注意: 用$where查询时, mongodb是把bson结构的二进制数据转换为json结构的对象, 然后比较对象的属性是否满足表达式.

速度较慢

6.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中的列的默认值

7.声明游标: 7.1

var cursor = db.collectioName.find(query,PRojection); Cursor.hasNext() ,判断游标是否已经取到尽头 Cursor. Next() , 取出游标的下1个单元

7.2 用while来循环游标

> var mycursor = db.bar.find({_id:{$lte:5}}) > while(mycursor.hasNext()) { ... printjson(mycursor.next()); ... }

7.3 // 声明游标 var cursor = db.goods.find(); // 循环游标

for(var doc=true;cursor.hasNext();) { printjson(cursor.next());}

也可以简写:

for(var cursor=db.goods.find(), doc=true;cursor.hasNext();) { printjson(cursor.next());}

7.4 游标还有一个迭代函数,允许我们自定义回调函数来逐个处理每个单元. cursor.forEach(回调函数); 例:

> var gettitle = function(obj) {print(obj.goods_name)} > var cursor = db.goods.find(); > cursor.forEach(gettitle);

7.5 游标在分页中的应用 比如查到10000行,跳过100页,取10行. 一般地,我们假设每页N行, 当前是page页 就需要跳过前 (page-1)*N 行, 再取N行, 在mysql中, limit offset,N来实现 在mongo中,用skip(), limit()函数来实现的

var mycursor = db.bar.find().skip(9995); 则是查询结果中,跳过前9995行

查询第901页,每页10条 则是 varmytcursor=db.bar.find().skip(9000).limit(10);

7.6 通过cursor一次性得到所有数据, 并返回数组. 例:

>var cursor = db.goods.find(); > printjson(cursor.toArray()); //看到所有行 > printjson(cursor.toArray()[2]); //看到第2行

注意: 不要随意使用toArray() 原因: 会把所有的行立即以对象形式组织在内存里. 可以在取出少数几行时,用此功能.