MongoDB常用命令及例子详细介绍(三)(一)

2015-01-21 11:32:22 · 作者: · 浏览: 20
常用命令,及其高级命令使用介绍
一:增删改查的高级应用详细介绍:
	增:***插入的时候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个参数只能配合魔术变量使用$