

常用命令,及其高级命令使用介绍 一:增删改查的高级应用详细介绍:增:***插入的时候c1不在的话将自动创建***不管插入那条记录都会自动给带个值id 自增主键唯一insert 和 save(当id冲突是则修改,否则插入)一:id主键不冲突的情况没区别db.c1.insert({name
常用命令,及其高级命令使用介绍
一:增删改查的高级应用详细介绍:
增:***插入的时候c1不在的话将自动创建***
不管插入那条记录都会自动给带个值id 自增主键唯一
insert 和 save(当id冲突是则修改,否则插入)
一:id主键不冲突的情况没区别
db.c1.insert({name:"leyangjun"});
db.c1.insert({name:"leyangjun"}); insert插入的值id都是唯一的,不会主键id冲突
db.c1.save({name:"leyangjun"}); 和insert一样没区别插入记录的id都是唯一主键
二:id主键冲突的情况(冲突则更新)
db.c1.insert({_id:1,name:"leyangjun2"});
db.c1.insert({_id:1,name:"leyangjun2"}); 在插入同样的值就会报错
db.c1.save({_id:1,name:"leyangjun3"}); --就插入成功,id冲突则更新,把idname=leyangjun2 改成leyangjun3
还可以这么插入(很灵活):
*最好别这么玩,这么的后果就是你在php程序里面用时取值就麻烦啦
db.c1.insert({name:"user1",post:{tit:1,cnt:1111}}); --值是子JSON
db.c1.insert({name:"user1",post:[1,2,3,4,5,6]}); --值是数组
既能是js的json还可以循环插入10条:
for(i=1; i<=10; i++){
db.c1.insert({name:"user"+i});
}
删:
db.c1.remove(); 全部删除 ==({})空JSON,是json的就全删除
db.c1.remove({name:"user1"}); --指定删除
查:
db.c1.find(); ==({})查询所有
db.c1.find({name:"user3"}); 条件查询
场景:记录中有多列只要指定的列(但是_id会默认带上),要的为1,不要为0
db.c1.insert({name:"leyangjun",age:23,sex:"nan"});
db.c1.find({name:"leyangjun"},name:1); 只取这条记录name这列
db.c1.find({name:"leyangjun"},name:1,age:1); 取name,age这个2列
db.c1.find({name:"leyangjun"},name:1,_id:0); 不要默认的_id列
条件表达式查询:
1): <,<=,>,>= --$gt大于、$lt小于 、$gte大于等于、$lte小于等于
插入10做测试
for(i=1; i<=10; i++){
db.c1.insert({name:"user"+i,age:1})
}
db.c1.find({age:$gt:5}); 年龄大于5的 $gt大于
db.c1.find({age:$lt:5}); 年龄小于5的 $lt小于
db.c1.find({age:$gte:5}); 年龄大于等于5的 $gte大于等于
db.c1.find({age:$lte:5}); 年龄小于等于5的 $lte小于等于
db.c1.find({age:5}); 年龄等于5的
db.c1.find({age:$ne:5}); 年龄不等于5的
统计里面有多少条记录:db.c1.count(); 或者 db.c1.find().count();
排序:
db.c1.find().sort({age:1}) --- 1表示升序
db.c1.find().sort({age:-1}) --- -1是降序
limit和 结合 skip分页:
db.c1.find().limit(3); ---从0开始拿3条记录
db.c1.find().skip(1).limit(5); ---跳过一个拿出5条(也就是从第几个开始拿几个) 2,3,4,5,6
db.c1.find().sort({age:-1}).skip(1).limit(5).count(0); ---count统计默认是0,不会看前面写的条件,有几条就统计几条
db.c1.find().sort({age:-1}).skip(1).limit(5).count(1); ---按照前面的条件在统计记录数
2):$all,查出包含某个值 --主要针对数组来用
db.c1.insert({name:"user"},post:[1,2,3,4,5,6]);
db.c1.find({post:{$all:[1,2,3]}}); --找出post中包含1,2,3的,其中有值为假就查不出来
3):$exists 操作检查一个字段是否存在
db.c1.find({age:{$exists:1}}); ---查看是否包含字段age
4):$mod 取余
db.c1.find({age:{$mod:[2,1]}}); ---取对2 余1的 1,3,5,7,9.....
db.c1.find({age:{$mod:[2,0]}}); ---取对2 余0的 2,4,6,8,10.....
5):$ne 不等于
db.c1.find({age:$ne:5}); 年龄不等于5的
6):$in 和 $nin 类似于传统关系型数据库中的in , not in
db.c1.find({age:{$in:[1,3,5]}}); ---age等于1,3,5的值(是不是数组是操作符)
b.c1.find({age:{$nin:[1,3,5]}}); ---age不等于1,3,5的
*规律:查询的时候一般出现的[1,3,5]是操作符不是数组
7):$or 、$nor(二者是相反的)
db.c1.find({$or:[{name:"user2"},{name:"user3"}]}); --找出name=user2 或者 name=user3的记录
db.c1.find({$nor:[{name:"user2"},{name:"user3"}]}); --过滤掉name=user2和user3的记录
db.c1.find({$or:[{name:"user2"},{age:8},{age:10}]}); --找出name=user2 或 age=8 或 age=10的记录
db.c1.find({$nor:[{name:"user2"},{age:8},{age:10}]}); ----找出name!=user2 或 age!=8 或 age!=10的记录
8):$size 找出字段数组值的个数->专门正对数组的操作
db.c1.insert({name:"user1",post:[1,2,3,4,5,6]}); 第一条记录
db.c1.insert({name:"user1",post:[7,8,9]}); 第二条记录
db.c1.find({post:$size:3}); --就会找到第二条记录,post里面的的个数是3
9)****正则表达式*******
和js正则一样:
db.c1.find({name:/user/i}); ---找出name值包含user的
10):DISTINCT 类似关系数据库中的distinct
db.c1.insert({name:"leyangjun"});
db.c1.insert({name:"leyangjun"});
db.c1.distinct("name"); ---name值去重,查出一条记录
11):$elemMatch元素匹配
db.c3.insert({name:"user1",post:[{tit:1},{tit:2},{tit:3}]});
db.c3.insert({name:"user2",post:[{tit:"aaa"},{tit:"bbb"},{tit:"ccc"}]});
查找tit=2的记录
db.c3.find({"post.tit":2}); --可以找到
db.c3.find({post:{$elemMatch:tit:2}}); --这种方式匹配
db.c3.find({post:{$elemMatch:tit:2,tit:3}}); --匹配tit=2 tit=3的记录
12):游标的概念(用的很少)
var x=db.c1.find();
x.hasNext(); --有没有值,返回的是true 和 false,true的话就去链接数据库拿值,否则链接数据库
x.next() --取出来一条值
x.next()
x.next()
x.next() ---有值就一直往下取
x.hasNext(); ---为FALSE也就没值啦
13):null查询(没有值,值为空,值为NULL的)
匹配age=null的
db.c4.find({age:null}); ---这个匹配是不准的,记录中没有age字段的也会被查出来
db.c4.find({age:{$exists:1,$in:[null]}}); --先判断过滤age是否存在,在匹配age=null的
或
db.c4.find({age:$type:10}); ---10就是null 推荐使用这种查null
db.c4.find({age:$type:10,name:"user1"}); --age=null 并且 name=user1
14):$slice->只针对数组
db.c3.insert({name:"user1",post:[{tit:1},{tit:2},{tit:3}]});
db.c3.find({name:"user1",{post:$slice:2}}); ---取name=user1,前2条贴,就是post字段的值 对应数组的:1,2
db.c3.find({name:"user1",{post:$slice:-2}}); ---取name=user1,后2条贴,就是post字段的值 对应数组的:2,3
db.c3.find({name:"user1",{post:$slice:[1,2]}}), --- 从第1条开始取2条贴 对应数组的:2,3
改:
update语法介绍 默认是0,0--后面2个参数值
db.collection.update(criteria,objNew,upsert,multi);
参数说明:
criteria:用于设置查询条件的对象
objnew:用于设置更新的内容对象
upsert:如果记录已经存在,更新它,否则新增一个记录
multi:如果有多个符合条件的记录,全部更新
注意:默认情况,只会更行第一个符合条件的记录哦
例子:
db.c1.insert({name:"leyangjun",age:23);
db.c1.update({name:"leyangjun"},{sex:"nan"}); --这样会吧name,age删掉,记录只会留下sex字段值
db.c1.update({name:"user6"},{name:"user66"},1); --1表示,user6存在则改成user66,否则user6不存在则增加新的记录name=user66
第4个参数只能配合魔术变量使用$set,批量更新
db.c1.update({name:"user6"},{$set:{name:"user66"}},0,1); --将所有的name=user6的全部更新user66
2):$set 增加字段,或批量修改字段值(存在则更新,不存在则增加)
db.c1.update({name:"user6"},{$set:{name:"user66"}},0,1); --批量修改name值
db.c1.update({name:"user10"},{$set:{age:10}},0,1); --将name=user1的全部加上 age字段,且值=10
3):$inc -->increment自增的意思,如果字段有则加减(自己定),没有则新增
场景:现在在大促了,想给没给会员赠送5个积分,但是:积分字段有的会员没有有的有的情况
现在想没有积分字段的会员也得加5分,$inc就能做到
db.c1.insert({name:"leyangjun",age:23,score:11});
db.c1.insert({name:"leyangjun",age:23,score:1});
db.c1.insert({name:"leyangjun",age:23});
--加积分
db.c1.update({},{$inc:score:10},0,1); --{}表示所有用户,都加10个积分,没有score字段的,$inc会统一加上
db.c1.update({name:"user1"},{$inc:score:10}); 加减都行
db.c1.update({name:"user1"},{$inc:score:-10});
*set 和 $inc 都可以增加字段,但是$inc增加必须是整型
4):$unset 删除字段(自带的_id字段是删不鸟的)
db.c5.update({},{$unset:{score:1},0,1); --1表示true,将所有记录中的score字段删掉
db.c5.update({},{$unset:{score:1,age:1},0,1); --删除多个
5):$push 针对数组增加元素(更新的魔术方法一般在字段的外侧,查询是在内侧)
db.c3.insert({name:"user1",arr:[1,2,3]});
db.c3.update({name:"user1"},{$push:{arr:4}}); --name=user1的arr增加元素,记住不能同时插入多个(可以压数组,就是不能同时压入多个值)
6):$pop 将字段里的最后元素移除,针对数组
db.c3.update({name:"user1"},{$pop:{arr:1}}); --1表示最后一个,将arr里面的最后元素移除
db.c3.update({name:"user1"},{$pop:{arr:-1}}); -- -1表示删除第一个值
7):$pushAll 压入多个值
db.c3.update({name:"user1"},{$push:{arr:[4,5,6]}}); ---压入多个值
8):$addToSet 压入值是会去重复插入(如值里面有4,在这么插入里面只会有一个4)
db.c3.update({name:"user1"},{$addToSet:{arr:4}}); --如果值里面有4,是插入不进去的,没有重复的则插入
$addToSet 和 $each 配合使用插入多个:
db.c3.update({name:"user1"},{$addToSet:{arr:{$each:[7,8,9]}}}); --插多个
9):$pull 删除数组里面的某个值,针对数组
db.c3.update({name:"user1"},{$pull:{arr:5}}); --删除数组中为5的值
10):$pullAll一次性删除多个
db.c3.update({name:"user1"},{$pullAll:{arr:[2,4]}}); --删除值为2,4
11):$rename修改字段名
db.c3.update({name:"user1"},{$rename:{arr:"post"}}); 或
db.c3.update({name:"user1"},{$rename:{"arr":"post"}});
12):特殊的操作符号 $
db.c3.insert({name:"user1",arr:[{tit:"php"},{tit:"java"},{tit:"linux"}]});
把标题为linux的值改下:
db.c3.update({"arr.tit":"linux"},{$set:{"arr.$.cnt":"linux is very good"}});
*小结:
场景1:
db.c1.insert({name:"leyangjun",age:23});
var x=find({name:"user1"});
x --回车有值
x --在回车没值了,所以find本身是带有游标的
场景2:
var x=findOne({name:"user1"});
x --回车有数据 x是一个json,在mogodb客户端的时候后期在更新MongoDB高级知识
