一、数据库增删改查(库)(集合---表,文档--行,字段--列)
1、选择和创建数据库(增)
use 数据库名称
事例:创建spit数据库(如果有就选择、没有就创建)
use spitdb
2、删除数据库(删)
db.dropDatabase();#删除数据库
3、修改数据库(改)
方法一: 拷贝数据库后,删除原来的数据库
db.copyDatabase('old_name', 'new_name');
use old_name
db.dropDatabase();
方法二: 利用renameCollection命令、 如果有多个集合,循环处理
db.adminCommand({renameCollection: "db1.test1", to: "db2.test2"})
4、查看数据库和集合(查)
show dbs #查看数据库
二、集合的增删改查(表)
1、创建集合(增)
db.集合名称.insert(数据);
2、删除集合(删)
db.t_member.drop();#删除集合不仅删除集合的文档,也会删除集合本身,同时也会删除在集合上创建的索引。
对比:
db.spit.remove({})#remove用于将集合中的文档删除,但不删除集合本身,也不删除集合的索引。
3、修改集合(改)
同数据库
3、查询集合(查)
show collections #查看集合
三、集合文档的增删改查(行)
1、创建集合并插入文档(增)
语法:创建集合并插入文档
db.集合名称.insert(数据);
事例:
db.spit.insert({content:"听力测试",userid:"1011",nickname:"肉丝",visits:NumberInt(902)})
注:
mongo中的数字,默认情况下是double类型,如果要存整型,必须使用函数NumberInt(整型数字),否则取出来就有问题了
2、删除集合文档(删)
语法:
db.集合名称.remove(条件)
事例:
db.t_member.remove({age:1}) #删除满足条件的第一条只删除数据不删除索引
db.spit.remove({})#remove用于将集合中的文档删除,但不删除集合本身,也不删除集合的索引。
db.spit.remove({visits:2000})#删除visits=2000的记录
3、修改集合文档(改、实际是改文档里的字段)
(1)、语法:(不建议使用)
db.集合名称.update({条件},{修改后的数据}) //最好不要用
事例:修改_id为1的记录,浏览量为2000,输入以下语句:
db.spit.update({_id:"1"},{visits:NumberInt(2000)})
发现,这条文档除了visits字段其它字段都不见了,为了解决这个问题,我们需要使用修改器$set来实现
(2)、语法:(建议使用)
db.集合名称.update({条件},{$set:{修改后的数据}}) //使用这个
事例:
db.spit.update({_id:"2"},{$set:{visits:NumberInt(2000)}})#不会影响其他属性列,主键冲突会报错
db.集合名称.update({条件},{$set:{修改后的数据}},true)
#第三个参数为true则执行insertOrUpdate 操作,查询出则更新,没查出则插入
(3)、批量更新字段(字段--列)
db.t_member.update({name:"lisi"},{$set:{name:"lisi11"}},false,true);
批量操作需要和选择器同时使用,第一个false 表示不执行insertOrUpdate 操作,第二个true 表示执行批量
(4)、更新器$set、$inc、$unset、$push、$pushAll、$addToSet、$pop、$pull、$、$each
$set : 指定一个键值对,若存在就进行修改,不存在则添加
$inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:
db.t_member.update({name:"zhangsan"},{$inc:{age:2}})#执行结果是名字叫“zhangsan”的年龄加了2
$unset : 删除指定的键:
db.t_member.update({name:"zhangsan"},{$unset:{age:1}})
$push : 数组键操作:
1、如果存在指定的数组,则为其添加值;
2、如果不存在指定的数组,则创建数组键,并添加值;
3、如果指定的键不为数组类型,则报错;
db.students.update({ _id: 1 },{ $push: { scores: 89 } })#添加89到scores字段中
$pushAll : 追加多个值到一个数组字段内
db.t_member.update({name:"zhangsan"},{$pushAll:{classes:["English","Math","Chinese"]}});
$addToSet : 当指定的数组中有这个值时,不插入,反之插入
db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}}); #则不会添加到数组里
$pop:删除指定数组的值,当value=1 删除最后一个值,当value=-1 删除第一个值
db.t_member.update({name:"zhangsan"},{$pop:{classes:1}}) #删除了最后一个值
$pull : 删除指定数组指定的值
db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}}) #$pullAll 批量删除指定数组
db.t_member.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}})#若数组中有多个Chinese,则全删除
$addToSet 与$each 结合完成批量数组更新操作
db.t_member.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}})
$ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:
db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}})
(5)、runCommand 函数和findAndModify 函数
runCommand 函数可执行mongdb 中的特殊函数、findAndModify 就是特殊函数之一,用于返回执行update 或remove 后的文档
语法:
runCommand({
findAndModify:"persons",
query:{查询器},
sort:{排序},
update:{修改器},
new:true 是否返回修改后的数据
});
事例:
ps=db.runCommand({
findAndModify:"persons",
query:{name:"zhangsan"},
update:{$set:{name:"lisi"}},
new:true
})
ps.value
4、查询集合文档(查)
语法:
db.集合名称.find(条件)
db.集合名称.findOne(条件)
事例:查询spit集合的所有文档,我们输入以下命令
db.spit.find()
或
db.spit.find({})
注:
这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,
当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。
如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型。
可以输入以下测试:
db.spit.insert({_id:"4",content:"坚持就是胜利",userid:"1014",nickname:"诺诺",visits:NumberInt(1223)});
事例:按条件来查询
db.spit.find({userid:'1013'})
或
db.spit.find({userid:"1013"})
事例:返回符合条件的第一条数据
db.spit.findOne({userid:'1013'})
事例:查询排序
db.spit.find().sort({userid:-1,visits:1})
注:1代表正序、-1代表倒序
四、高级查询
1、查询所有数据
2、条件查询
3、包含查询(只针对数组)
包含与不包含$in或$nin
3、比较查询
4、$or查询
5、正则表达式
6、$not的使用
7、$all与index使用
8、$size的使用、不能与比较查询符同时使用
9、$slice操作符返回文档中指定数组的内部值
10、文档查询
11、分页与排序
12、游标
13、查询快照
14、查询点(*,*)
15、Count+Distinct+Group使用
五、其它命令
1、查询服务器版本号和主机操作系统 >db.runCommand({buildInfo:1})
2、查询执行集合的详细信息,大小,空间,索引等>db.runCommand({collStats:"persons"})
3、查看操作本集合最后一次错误信息>db.runCommand({getLastError:"persons"})
4、创建一个新的固定集合要求大小是100 个字节,可以存储文档10 个
>db.createCollection("mycoll",{size:100,capped:true,max:10})
5、把一个普通集合转换成固定集合
>db.runCommand({convertToCapped:"persons",size:1000})
6、对固定集合反向排序,默认情况是插入的顺序排序
>db.mycoll.find().sort({$natural:-1})
固定集合:
固定集合默认是没有索引的就算是_id 也是没有索引的
由于不需分配新的空间他的插入速度是非常快的
固定集合的顺是确定的导致查询速度是非常快的
最适合就是日志管理