1. 程式人生 > >MongoDB陣列的操作

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放在引數的最後,作為結果進行調優。