遊標
遊標是指資料可以一行行的進行操作,非常類似於 ResultSet 資料處理。在 MongoDB 資料庫裡面,對於遊標的控制非常簡單,只需要使用 find() 函數就可以返回遊標了。
對於返回的遊標,若要想進行操作,則使用以下兩個函數: 判斷是否有下一行資料:hasNest() 取出當前資料:next()
例如:
var cursor = db.students.find();cursor.hasNext();cursor.next();
以上是遊標的操作形式,但是是實際上不可能這麼去用,因為必須利用迴圈才能夠輸出內容。
範例:編寫具體的作業碼
var cursor = db.students.find();while(cursor.hasNext()){ var doc = cursor.next(); print(doc.name);}
相當於每一個資料都單獨拿出來進行逐行的控制。當遊標資料取出來之後,實際上每行資料返回的都是一個 Object類型的內容,那麼如果需要將資料按照 json 的形式出現,則可以使用 printjson() 函數完成。代碼如下:
var cursor = db.students.find();while(cursor.hasNext()){ var doc = cursor.next(); printjson(doc.name);}
在所有的已知資料庫,只有 MongoDB 的遊標操作是最簡單,最直觀的。 索引
在任何的資料庫之中,索引都是一種提升資料庫檢索效能的手段,這一點在 MongoDB 資料庫之中同樣是存在的。
MongoDB 索引建立分為兩種:自動建立和手工建立。
這裡寫代碼片
此時在 students 集合上並沒有去設定任何的索引,通過 getIndexes()
範例:查詢預設狀態下的 students 集合的索引內容
db.students.getIndexes();
若建立自己的索引,文法如下: 索引建立:db.集合名稱.ensureIndex({“列”: 1})
設定 1 時,表示索引將按照升序的方式進行排列 設定 -1 時,表示索引將按照降序的方式進行排列。 唯一索引
“唯一索引”主要目的是用在某一個欄位上,使該欄位的內容不重複。
範例:建立唯一索引
db.students.ensure({"name": 1}, {"unique": true});
到期索引
在一些程式網站會出現若干秒之後,資訊被刪除的情況。例如:手機資訊驗證碼。在 MongoDB 裡面可以輕鬆實現到期索引,但是這個時間往往不怎麼準確(這個特性在進行一些臨時資料儲存的時候非常有協助)。
範例:在一個 phones 集合裡面設定到期索引
db.phones.ensureIndex({"time": 1}, {"expireAfterSeconds: 10"}) //設定索引在 10 秒後到期
全文索引
在一些資訊管理平台上經常需要進行資訊模糊查詢,最早的時候是利用某個欄位上實現的某種查詢,但是這個時候返回的資訊並不會很準確,因為只能查詢 A 欄位或是 B 欄位,而在 MongoDB 裡面實現了非常簡單的全文檢索索引。
範例:定義一個新的集合
db.news.insert({"title":"mldn mldnjava lxh gyh", "content": "gyh"})db.news.insert({"title":"mldn mldnjava lxh", "content": "java"})db.news.insert({"title":"gyh", "content": "sfq"})db.news.insert({"title":"gyh", "content": "gry"})db.news.insert({"title":"sfq", "content": "gry"})
範例:設定全文檢索索引
//待續
“$text” 判斷符用於表示全文檢索索引。
“$search“運算子用於資料的查詢,使用如下: 查詢指定關鍵字:{“$search”: “查詢關鍵字”} 查詢多個關鍵字(即”或“關係):{“$search”: “查詢關鍵字 查詢關鍵字 …”} 查詢多個關鍵字(即”與“關係):{“$search”: “\”查詢關鍵字\” \”查詢關鍵字\” …”} 查詢多個關鍵字(排除某一個):{“$search”: “查詢關鍵字 查詢關鍵字 …-排除關鍵字”}
範例:查詢單個內容
db.news.find({"$text": {"$search": "gry"}});
範例:包含有 “gry” 與 “sfq” 的資訊
db.news.find({"$text": {"$search": "gry gyh"}});
範例:同時包含有 “mldn” 與 “lxh” 的內容
db.news.find({"$text": {"$search": "\"mldn\" \"lxh\""}});
範例:包含有 “mldn” 但沒有 “gyh” 的內容
db.news.find({"$text": {"$search": "\"mldn\" \"lxh\" -gyh"}})
但是在進行全文檢索索引操作的時候,還可以使用相似性的打分來判斷檢索成果。
範例:為結果打分
db.news.find({"text": {"$search": "gyh"}}, {"score": {"$meta": "textScore"}})db.news.find({"text": {"$search": "gyh"}}, {"score": {"$meta": "textScore"}})
按照打分的成績進行排列,實際上就可以實現更加準確的資訊檢索。
當欄位太多時,可以為所有的欄位設定全文檢索索引。
範例:為所有欄位設定全文檢索索引
db.news.ensure({"$**": "text"});
地理資訊索引
地理資訊索引分為兩類: 2D平面索引 和 2DSphere球面索引
在2D平面索引裡面基本上能夠儲存的資訊都是座標,而且座標儲存的就是經緯度座標。
範例:定義一個商鋪的集合
db.shop.insert({loc: [10, 10]});db.shop.insert({loc: [11, 10]});db.shop.insert({loc: [10, 11]});db.shop.insert({loc: [12, 15]});db.shop.insert({loc: [16, 17]});db.shop.insert({loc: [90, 90]});db.shop.insert({loc: [120, 130]});
//待續