MongoDB数组的操作

例如我有记录:
clazz
{"_id":1,"name":"90班","students":[{"uid":12,"uname":"张三"},{"uid":12,"uname":"李四"}}
{"_id":2,"name":"91班","students":[{"uid":21,"uname":"张三"},{"uid":22,"uname":"王五"}}
{"_id":3,"name":"92班","students":[{"uid":31,"uname":"赵六"},{"uid":32,"uname":"小二"},{"uid":33,"uname":"小小鸟"}}
{"_id":4,"name":"93班","students":[{"uid":41,"uname":"小三"}}。



1、查询包含张三的所有班级信息
db.clazz.find({"students.uname":"张三"});此时我们会查出_id in (1,2)的记录


2、如果我要查张三且李四都在的班级
db.clazz.find({"students.uname":{"$all":["张三","李四"]}}),注意此时的顺序数组顺序是没有关系的
db.clazz.find({"students.uname":["张三","李四"]});此时如果将 "李四,张三"调转头来,查询是存在问题的
所以上面两个方法就在不同的场合有不同的用处了


3、$size,这个操作符是用来精确匹配数组拥有的成员个数的操作符。但它的不足之处在于,无法与 $gt 之类的操作符一起使用。
正确使用: db.clazz.find({"students":{"$size":3}});//这时候能够查出id in(3)的记录针对#size的缺陷
解决方案是在该文档中,添加一个专门存储数组大小的元素。


4、按照数组下标来查找数据的方法
db.clazz.find({"student.1.uname":"李四"});//查找数组第二个元素的uname为李四的人。查出记录 id in(1)

5、$slice截取数组中的元素,它有两种取值方式
从前面开始取数据:[2,3],跳过前两个元素,截取三个元素,如果剩余不足3个,则返回所有剩余
从后面开始取数据:-1表示截取最后一个,如{$slice:[-3,1]}从倒数第三个开始算,取第1个(也就是倒数第二个)
但是有一点需要注意的是,$slice操作符的位置,不像上面的一样,在find的第一个区域里面,而是在第二个
即显示记录区域,例如: db.clazz.find({"_id":1},{"$slice":[2,3]})

6、$eleMatch,如果要查询的是按数组的一组条件,那么使用它就最好不过了,
例如db.clazz.find("student":{"$eleMatch":{"uname":"张三","uid":{"$lte";20}}}),查出来的结果 _id in (1)

7、$where 这个方法算是mongoDB为我们提供的一个终级型武器,当上面我们提到的元素都无法满足你的要求时,那么我们可以使用它了。
	db.clazz.find("$where":function(){
		for(var current in this){
			for(var other in this){
				if(current != other && this[current] == this[other]){
					return true;
				}
			}
		}
		return false;
	});


上面的示例是最典型的判断一个文档,如果两个键值相等就选出来,否则不选。
而本例最重要的是告诉我们,$where后面可以带任意的javascript作为查询的一部分,难道还有查不出来的值?当然在实际操作过程中,我们尽量避免使用 $where,原因显而易见。如果实在不可避免,我们尽量使用多个查询先过滤一部分数据,然后将 $where放在参数的最后,作为结果进行调优。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值