mongodb 高階查詢 高階操作 非常全
面向文件的 NoSQL 資料庫主要解決的問題不是高效能的併發讀寫,而是保證海量資料儲存 的同時,具有良好的查詢效能。
MongoDB 最大的特點是他支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語 言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。
由於 MongoDB 可以支援複雜的資料結構,而且帶有強大的資料查詢功能,因此非常受到歡迎,很多專案都考慮用 MongoDB 來替代 MySQL 等傳統資料庫來實現不是特複雜的 Web 應用。資料庫資料量很大,遷移到 MongoDB 上面,資料查詢的速度會得到非常顯著的提升。
條件操作符
db.collection.find({ "field" : { $gt: value } } ); // 大於: field > value
db.collection.find({ "field" : { $lt: value } } ); // 小於: field < value
db.collection.find({ "field" : { $gte: value } } ); // 大於等於: field >= value db.collection.find({ "field" : { $lte: value } } ); // 小於等於: field <= value
如果要同時滿足多個條件,可以這樣做
db.collection.find({ "field" : { $gt: value1, $lt: value2 } } ); // value1 < field < value
$all 匹配所有
這個操作符跟 SQL 語法的 in 類似,但不同的是, in 只需滿足( )內的某一個值即可, 而$all 必 須滿足[ ]內的所有值,例如:
db.users.find({age : {$all : [6, 8]}});
可以查詢出 {name: 'David', age: 26, age: [ 6, 8, 9 ] }
但查詢不出 {name: 'David', age: 26, age: [ 6, 7, 9 ] }
$exists 判斷欄位是否存在
查詢所有存在 age 欄位的記錄
db.users.find({age: {$exists: true}});
查詢所有不存在 name 欄位的記錄
db.users.find({name: {$exists: false}});
Null 值處理
樣例資料:
其中”Lily”的 age 欄位為空,Tom 沒有 age 欄位,我們想找到 age 為空的行,具體如下:
奇怪的是我們以為只能找到”Lily”,但”Tom”也被找出來了,所以”null”不僅能找到它自身, 連不存在 age 欄位的記錄也找出來了。那麼怎麼樣才能只找到”Lily”呢?我們用 exists 來限制 一下即可:
$mod 取模運算
C1 表的資料如下:
查詢 age 取模 6 等於 1 的資料 :
$ne 不等於
查詢 x 的值不等於 3 的資料
db.things.find( { x : { $ne : 3 } } );
$in 包 含:
查詢 age 的值在 7,8 範圍內的資料
$nin 不包含:
樣例資料:
查詢 age 的值在 7,8 範圍外的資料
$size 陣列元素個數
對於{name: 'David', age: 26, favorite_number: [ 6, 7, 9 ] }記錄
匹配 db.users.find({favorite_number: {$size: 3}});
不匹配 db.users.find({favorite_number: {$size: 2}});
正則表示式匹配
查詢不匹配 name=B*帶頭的記錄
db.users.find({name: {$not: /^B.*/}});
Javascript 查詢和$where 查詢
查詢 a 大於 3 的資料,下面的查詢方法殊途同歸 :
db.c1.find( { a : { $gt: 3 } } );
db.c1.find("this.a > 3");
f = function() { return this.a > 3; }
db.c1.find(f);
count 查詢記錄條數
count 查詢記錄條數
db.users.find().count();
skip 限制返回記錄的起點
從第 3 條記錄開始,返回 5 條記錄(limit 3, 5)
db.users.find().skip(3).limit(5);
**sort 排序**
以年齡升序 asc
db.users.find().sort({age: 1});
以年齡降序 desc
db.users.find().sort({age: -1});
遊標:
儲存過程:
MongoDB 同樣支援儲存過程。關於儲存過程你需要知道的第一件事就是它是用 javascript 來 寫的。
儲存以下函式:
下面我們將這個 sql 自定義函式轉換為 MongoDB 的儲存過程:
儲存過程可以被檢視,修改和刪除,所以我們用 find 來檢視一下是否這個儲存過程已經被 建立上了。
來實際呼叫一下這個儲存過程:
刪除資料庫: