很少说,直接上干货!php
输入mongo
进入shell命令模式,默认链接的数据库是test数据库,在此以前必定要确保你已经启动了MongoDB,不然会出现错误,启动以后运行成功,以下截图: html
root@zhouls-virtual-machine:~# mongo MongoDB shell version: 2.4.9 connecting to: test >
或者以这种方式来链接java
root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root MongoDB shell version: 2.4.9 connecting to: 192.168.80.31:27017/admin >
数据库相关 (这只是部分而已)c++
show dbs:显示数据库列表
show collections:显示当前数据库中的集合(相似关系数据库中的表table)
show users:显示全部用户
use yourDB:切换当前数据库至yourDB
db.help() :显示数据库操做命令
db.yourCollection.help() :显示集合操做命令,yourCollection是集合名
注意:MongoDB没有建立数据库的命令,若是你想建立一个“School”的数据库,先运行use School
命令,以后作一些操做(如:建立汇集集合db.createCollection('teacher')
),这样就能够建立一个名叫“School”的数据库。截图以下: web
root@zhouls-virtual-machine:~# mongo 192.168.80.31:27017/admin -u root -p root MongoDB shell version: 2.4.9 connecting to: 192.168.80.31:27017/admin > show dbs admin 0.203125GB local 0.078125GB test 0.203125GB > use school switched to db school > db.createCollection('teacher') { "ok" : 1 } > show dbs admin 0.203125GB local 0.078125GB school 0.203125GB test 0.203125GB >
下面以一个School数据库为例,在School数据库中建立两个集合teacher和student,并对student集合中的数据进行增删改查基本操做(集合Collection至关于关系型数据库中的表table)。 sql
一、切换到School数据库mongodb
use School #切换到School数据库。MongoDB 无需预建立School数据库,在使用时会自动建立
刚上面,我已经建立好了。shell
二、建立Collection数据库
db.createCollection('teacher') #建立一个汇集集合。MongoDB 其实在插入数据的时候,也会自动建立对应的集合,无需预约义集合
刚上面,我已经建立好了。json
> show collections
system.indexes
teacher
>
这样就显示,在teacher数据库里,建立集合(即关系型数据库里叫表),成功!
三、插入数据
与数据库建立相似,插入数据时也会自动建立集合(即关系型数据库里的表)。
插入数据有两种方式:insert和save。
db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可选 db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可选
这两种方式,其插入的数据中_id字段都可不写,会自动生成一个惟一的_id来标识本条数据。
而insert和save不一样之处在于:在手动插入_id字段时,若是_id已经存在,insert不作操做,save作更新操做;若是不加_id字段,二者做用相同都是插入数据。
截图以下:
> db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 20 } > db.student.save({_id:1, sname: 'zhangsan', sage: 22}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } > db.student.insert({_id:1, sname: 'zhangsan', sage: 25}) E11000 duplicate key error index: school.student.$_id_ dup key: { : 1.0 } > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } >
添加的数据其结构是松散的,只要是bson格式都可,列属性均不固定,根据添加的数据为准。先定义数据,再插入,就能够一次性插入多条数据,截图以下:
> s = [{sname:'lisi',sage:20},{sname:'wangwu',sage:20},{sname:'chenliu',sage:20}] [ { "sname" : "lisi", "sage" : 20 }, { "sname" : "wangwu", "sage" : 20 }, { "sname" : "chenliu", "sage" : 20 } ] > db.student.insert(s) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 } >
运行完以上例子,student集合已自动建立,这也说明 MongoDB 不须要预先定义 collection ,在第一次插入数据后,collection 会自动的建立。截图以下:
> show collections
student
system.indexes
teacher
>
四、查找数据 db.youCollection.find(criteria, filterDisplay)
criteria :查询条件,可选
filterDisplay:筛选显示部分数据,如显示指定列数据,可选(当选择时,第一个参数不可省略,若查询条件为空,可用{}作占位符,以下例第三句
db.student.find() #查询全部记录。至关于:select * from student db.student.find({sname: 'lisi'}) #查询sname='lisi'的记录。至关于: select * from student where sname='lisi' db.student.find({},{sname:1, sage:1}) #查询指定列sname、sage数据。至关于:select sname,sage from student。sname:1表示返回sname列,默认_id字段也是返回的,能够添加_id:0(意为不返回_id)写成{sname: 1, sage: 1,_id:0},就不会返回默认的_id字段了 db.student.find({sname: 'zhangsan', sage: 22}) #and 与条件查询。至关于:select * from student where sname = 'zhangsan' and sage = 22 db.student.find({$or: [{sage: 22}, {sage: 25}]}) #or 条件查询。至关于:select * from student where sage = 22 or sage = 25
查询操做相似,这里只给出db.student.find({sname: 'lisi'})
查询的截图,以下:
> db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } >
五、修改数据 db.youCollection.update(criteria, objNew, upsert, multi )
criteria: update的查询条件,相似sql update查询内where后面的
objNew : update的对象和一些更新的操做符(如$set
)等,也能够理解为sql update查询内set后面的。
upsert : 若是不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi: mongodb默认是false,只更新找到的第一条记录,若是这个参数为true,就把按条件查出来多条记录所有更新。默认false,只修改匹配到的第一条数据。
其中criteria和objNew是必选参数,upsert和multi可选参数
举例以下:
db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true) #至关于:update student set sage =30 where sname = 'lisi';
> db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 20 } > db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true) > db.student.find({sname: 'lisi'}) { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } >
六、删除数据
db.student.remove({sname: 'chenliu'}) #至关于:delete from student where sname='chenliu'
> db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } { "_id" : ObjectId("59316b5eaf2276c698170fb0"), "sname" : "chenliu", "sage" : 20 } > db.student.remove({sname: 'chenliu'}) > db.student.find() { "_id" : 1, "sname" : "zhangsan", "sage" : 22 } { "_id" : ObjectId("59316b5eaf2276c698170fae"), "sname" : "lisi", "sage" : 30 } { "_id" : ObjectId("59316b5eaf2276c698170faf"), "sname" : "wangwu", "sage" : 20 } >
六、退出shell命令模式
输入exit
或者Ctrl+C
退出shell命令模式
扩展学习
一、安装:
mongod -dbpath /home/xxlong/myInstall/mongodb_data
默认是在
dbpath=/var/lib/mongodb
mongod 启动数据库进程
--dbpath 指定数据库的目录
--port 指定数据库的端口,默认是27017
--bind_ip 绑定ip
--directoryperdb 为每一个db建立一个独立的子目录
--logpath 指定日志存放目录,默认是控制台
--auth 用安全认证方式启动数据库
--config 指定启动项用文件的路径
--fork 用守护进程的方式启动mongodb
--rest:是打开web监控页面,好比咱们这里监听10001端口,则打开http://10.1.49.225:11001/就能够看到这个mongodb数据库进程的信息
关闭:一、ctrl+c 二、db.shutdownServer()
二、mongodb客户端工具:
mongo 127.0.0.1/27017/admin 不填,默认链接本机test数据库。
一、查看数据库
show dbs
二、建立数据库
use xxlong:系统自动建立一个数据库(xxlong)。若是use以后没有建立 任何集合。系统就会删除这个数据库。
三、给定数据库添加集合(student)并添加记录(insert)
db.[documentName].insert({...});
db.student.insert({_id:13,name:'Cat',sex:1,age:23,score:[60,71,81,91,100]});
批量增长:for(var i=1;i<10;i++){
db.student.insert({_id:i,name:'xxl',age:i});
}
insert在_id相同的时候会报错,而save则不报错,而是更新
db.student.save({_id:13,name:'xxlong'});
四、查看数据库中的全部集合
show collections;
五、查看定制文档的数据
db.student.find();查看全部数据
db.student.findOne();查看第一条数据
六、更新文档(至关于传统数据库的记录)数据
db.student.update({_id:10},{$set:{age:21}});id为10的文档的age改成21,$set表示有这个键则修改,没有这个键则增长
db.student.update({age:10},{$set:{sex:1}},true,true),这个true表示查到年龄为10则修改, 查不到则插入,false表示为查到则修改,查不到什么也不作,不写则默认为false(至关于
InsertOrUpdate);这个true表示批量增长(全部年龄为10,修改性别为1),false则不是批量增长,默认为false;
db.student.update({_id:10},{$inc:{age:1}});id为10的文档的age自动加1
db.student.update({_id:10},{$unset:{age:x}});删除id为10的文档的age字段,x为任意数字
db.student.update({_id:13},{$push:{score:[100,101]}});score数组中新增值100,101
若是score键不存在,则新增长这个键,必须为数组
db.student.update({_id:13},{$pop:{score:x}});删除数组中的值,x为1删除最后一个,x为-1 删除最前的一个
db.student.update({_id:3},{$pull:{course:"computer"}}); 删除数组course中的computer值(能够为多个computer值)
db.student.update({_id:3},{$pullAll:{course:["math","english"]}}); 删除数组中多个不一样的值
db.student.update({_id:10},{$rename:{'age':'AGE'}});修改id为10的文档的age字段名
db.student.update({_id:3},{$set:{course:['math','computer']}})
db.student.update({_id:1},{$addToSet:{course:'math'}})结果:math,computer
db.student.update({_id:1},{$addToSet:{course:'english'}})结果:math,computer,english
addToSet:目标数组存在新增长的项则不增长,不存在则增长(数组中有math,computer,再update math时不增长,而update english时,数组中没有english,则增长)
db.student.update({"_id":3},{$addToSet:{course:{$each:
["math","english","Chinese"]}}}); 批量增长
七、删除文档数据
db.student.remove({_id:10});删除id为10的文档的数据。
八、删除库中的集合
db.student.drop();
九、删除数据库
db.dropDatabase();
十、Shell的help
db.help();查看操做数据库的方法
db.student.help();查看操做集合的(student)方法
十一、mongodb的api
http://api.mongodb.org/js/2.1.2/index.html
十二、数据库和集合命名规范
一、不能是空字符串
二、不能含有‘ ’、(空格)、,、$、/、\、和\O(空字符)
三、应所有小写
四、最多64个字节
五、数据库名不能与现有系统保留库同名。如admin,config,local
1三、ecllipse中装入mongodb插件
help-->install new soft-->add-->Mongodb,http://www.jumperz.net/update/
1四、查找db.[documentName].find({条件},{键指定})
查找全部年龄在25至27岁之间的学生
db.student2.find({"age":{$lte:27,$gte:25}},{"_id":0,"name":1,"age":1}); _id=0表示不显示 id
查找全部不是美国的学生
db.student.find({"Country":{$ne:"USA"}},{"_id":0,"name":1,"Country":1});
查询全部是美国和中国的学生
db.student.find({"Country":{$in:["USA","China"]}},{"_id":0,"name":1,"Country":1});
查询全部不是美国和中国的学生
db.student2.find({"Country":{$nin:["USA","China"]}},{"_id":0,"name":1,"Country":1});
查询全部数学成绩大于65或者英语成绩小于95的学生
db.student.find({$or:[{"Math":{$gt:65}},{"English":{$lt:95}}]},
{"_id":0,"name":1,"Math":1,"English":1});
查询全部性别为空的学生
db.student.find({"sex":{$in:[null]}},{"_id":0,"name":1});
查询全部名字为To的学生
db.student.find({"name":/To/},{"_id":0,"name":1});
查询全部学生名字不含字母a的学生
db.student.find({"name":{$not:/a/}},{"_id":0,"name":1});
查询数组book中有java和c++的学生信息
db.student.find({"book":{$all:["java","C++"]}},{"_id":0,"name":1});
查询数组第二个值是java的学生信息
db.student.find({"book.1":"java"},{"_id":0,"name":1})
查询数组长度是2的学生信息
db.student.find({"book":{$size:2}},{"_id":0,"name":1});
查询名字含T的全部学生的书的数组的长度(游标)
var student = db.student2.find({"name":/T/});
while(student.hasNext()){print(student.next().book.length)};
查询学生的book数组中从下标1开始起共2个即book[1],book[2]
db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:[1,2]}})
查询学生的book数组中最后一个元素
db.student2.find({"name":"Tom5"},{"_id":0,"name":1,"book":{$slice:-1}})
查询前五条数据
db.student2.find({},{"_id":0,"name":1}).limit(5);
查询从第七条开始后三条数据即第7,8,9
db.student2.find({},{"_id":0,"name":1}).limit(3).skip(6);
查询的结果按年龄正序排序
db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:1});
查询的结果按年龄逆序排序
db.student2.find({},{"_id":0,"name":1,"age":1}).sort({age:-1});
快照的使用
db.student2.find({$query:{"name":"Tom5"},snapshot:true},{"_id":0,"name":1});
1五、索引
var start = new Date();
for(var i=0;i<20000;i++){
db.student.insert({"number":i,"name":"student"+i});
}
var end = new Date();
print((end-start)+"ms");
创建索引,查找速度变快1是正序建立索引(正序:越早的建立时间),-1为倒序建立索引(逆序:越迟的建立时间)
db.student.ensureIndex({"number":1});
var start = new Date();
db.student.find({"number":15997});
var end = new Date();
print((end-start)+"ms");
索引的建立在提升查询性能的同时会影响插入的性能。对于常常查询少插入的文档能够考虑用索引。
建立逆序索引name,并指定该索引名字为studentname
db.student.ensureIndex({"name":-1},{"name":"studentname"});
建立惟一索引name
db.student.ensureIndex({"name":1},{"unique":true});
若是集合中已经有重复的文档,踢出重复值
db.student.ensureIndex({"name":1},{"unique":true,"dropDups":true}) ;
指定查询所使用的索引(name正序索引),指定索引必须是建立好的索引
db.student.find({"name":"student333"}).hint({"name":1});
查看本次查询所使用的索引和查询数据的状态信息
db.student.find({"name":"student333"}).explain();
查看索引
db.system.indexes.find();
或db.system.namespaces.find();
不锁表建立索引
db.student.ensureIndex({"name":1},{"unique":true,"background":true})
删除索引
db.runCommand({"dropIndexes":"student",index:"name_1"});
批量删除
db.runCommand({"dropIndexes":"student",index:"*"});
db.map.find():
{ "_id" : ObjectId("55ae30a55e9fc03a8994fb34"), "gis" : { "x" : 185, "y" : 150 } }
建立2d索引,默认会创建[-180,180]的索引
db.map.ensureIndex({"gis":"2d"},{"min":-1,"max":200});
查询离点{70,180}最近的三个点
db.map.find({"gis":{$near:[70,180]}},{"gis":1,"_id":0}).limit(3);
查询以点(50,50)和点(190,190)为对角线的正方形中全部的点
db.map.find({"gis":{$within:{$box:[[50,50],[190,190]]}}},{"_id":0,"gis":1})
查询以(65,80)为点半径为50的圆内的点
db.map.find({"gis":{$within:{$center:[[65,80],50]}}},{"_id":0,"gis":1})
1六、查询结果的个数
db.student.find().count();
去重操做
db.runCommand({distinct:”persons”,key:”country”}).values
Group使用
查询服务器版本号和主机操做系统
db.runCommand({buildInfo:1});
查询集合详细信息,大小,空间,索引
db.runCommand({collStats:"student"});
查看mongodb命令
db.listCommands();
http://localhost:28017/_command
查看操做本集合最后一次错误信息
db.runCommand({getLastError:”student”})
1七、 固定集合
一、固定集合默认是没有索引的就算是_id也是没有索引的
二、因为不需分配新的空间,它的插入速度是很是快的
三、固定集合的顺序是肯定的,致使查询速度是很是快的
四、最适合的是应用就是日志管理
五、建立固定集合
建立一个新的固定集合,大小是100字节,能够存储文档十个。
db.createCollection("myColl",{size:100,capped:true,max:10});
六、将一个普通集合转为一个固定集合。
db.runCommand({"convertToCapped":"student","size":10000});
七、反向排序,默认是插入顺序排序
db.student.find().sort({$natural:-1});
八、尾部游标,惋惜shell不支持,java和php等驱动是支持的
1八、文件GridFS
一、上传一个文件(将/home/xxlong/xxlong.txt上传到数据库中,并从新命名为b.txt)
控制台(/bin/bash):mongofiles -d xxlong_db -l "/home/xxlong/xxlong.txt" put "b.txt"
二、查看GridFS的文件存储状态
show collections;
====>
fs.chunks
fs.files
db.fs.chunks.find();
===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000002"),
"files_id" : ObjectId("55af7b9e9199bc7fc2000001"),
"n" : 0,
"data" : BinData(0,"eHhsb25nIGxvbmcgaGVsbG8KMzExID
U2NyB5dWFuYmEKeHhsICB4aWFvCm
xvbmcJemkKdWVzdGMKCg==") }
db.fs.files.find();
===>{ "_id" : ObjectId("55af7b9e9199bc7fc2000001"),
"chunkSize" : 261120,
"uploadDate" : ISODate("2015-07-22T11:16:46.928Z"),
"length" : 58,
"md5" : "99eaa1494edf301e2c9bf51aee7f989e",
"filename" : "b.txt" }
查看文件内容
控制台:mongofiles -d xxlong_db get "b.txt" shell没法打开
查看全部文件
控制台:mongofiles -d xxlong_db list
删除已经存在的文件
控制台:mongofiles -d xxlong_db delete "b.txt"
1九、服务器端运行eval
db.eval("function(name){return name}","xxl");
输出:xxl
20、保存js全局变量,system.js是一个特殊的集合
db.system.js.insert({"_id":"show_name","value":"xxlong"}) ;
db.eval("return show_name") ===>xxlong
2一、导出数据
打开控制台(/bin/bash)
-d 指定要导出的库
-c 指定要导出的库的集合
-o 数据导出后存放的路径
-cvs指定导出的cvs格式
-q过滤导出
--type<json|csv|tsv>
切换到数据库目录下:
控制台:mongoexport --host 127.0.0.1 --port 27017 -d xxlong_db -c student -o /home/xxlong/xxl.json
2二、导入数据
mongoimport -d xxlong_db -c student --file /home/xxlong/xxl.json
切换到数据库目录下:
控制台:mongoimport --host 127.0.0.1 --port 27017 -d xxlong_db -c student110 --file "/home/xxlong/xxlong.json"
2三、运行时备份
导出127.0.0.1服务下的27017的数据库xxlong数据库
切换到数据库目录下:
控制台:mongodump --host 127.0.0.1:27017 -d xxlong_db -o /home/xxlong/
/home/xxlong 目录下是数据库名(xxlong_db)的文件夹,里面是备份的数据
2四、运行时恢复
切换到数据库目录下:
控制台:mongorestore --host 127.0.0.1:27017 -d xxlong_db /home/xxlong/xxlong_db
2五、上锁
上锁能够是缓冲区中的数据所有放到数据库中
db.runCommand({fsync:1,lock:1})
2六、解锁
db.fsyncUnlock();
2七、数据修复
当停电等不可逆转灾难来临的时候,因为mongodb的存储结构致使会产生垃圾数据,在数据恢复之后这垃圾数据依然存在,这是数据库提供一个自我修复的能力。
db.repairDatabase();