對於MongoDB來講視圖工具備MongoDB VUE等,我的不是很習慣使用視圖工具,因此比較喜歡使用MongoDB自帶的javascript shell。不是你們所謂的提高B格,只是我的習慣。一下的一些內容參考自《MongoDB 權威指南2》.javascript
在個人bin下面有一個js腳本我執行一下命令即可以完成調用。java
mongo script1.js
mongo --quiet script1.js [不打印MongDB shell Version ...]
load("script1.js") 登陸後執行
本篇博客主要包括如下內容:
一、使用find或者findOne 函數和查詢文檔數據庫執行查詢。
二、使用$條件查詢實現分爲查詢數據集包含查詢、不等式查詢,以及其餘查詢
三、查詢返回一個數據庫遊標,遊標只會在你須要時纔會將須要的文檔批量返回。
四、針對遊標的元數據操做,包括忽略必定數量的結果,或者限定返回結果的數量,或者限定返回結果的數量,以對結果集的排序正則表達式
MongoDB 中使用find查詢就是返回一個集合中的子文檔,範圍從0個文檔到整個集合。find的第一個參數決定了要返回那些文檔,這個參數是一個文檔。用於指定查詢條件。sql
一、基本查詢 shell
db.user.find();
返回user集合的全部文檔數據庫
相似於關係型數據庫的
select * form user數組
添加條件
db.user.find({"age":35,"name":"joe"});
能夠解釋爲:在user集合中查找 age=35而且name="joe" 符合條件的文檔。函數
二、指定查詢的返回列 工具
db.user.find({"age":35,"name":"joe"},{"_id":1});
只顯示"_id"鍵優化
要是顯示name 和 age鍵
db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":1});
"_id"剔除須要顯式的申明。
2.6 有一個小BUG
就是在
db.user.find({"age":35,"name":"joe"},{"_id":0,"age":1,"name":0});
會拋出如下異常
error:{
"$err":"Can't canonicalize query:BadValue Projection cannoet have mix"
of inclusion and exclusion.",
"coede":17287"
}
目前對這個錯誤不是很理解。
3.查詢的限制
先在user集合中添加firendAge鍵
db.user.update({},{"$set",{"firendAge":20}},ture,true);
update 的第三個參數的意思是在該鍵值不存在的時候是否爲該文檔添加 默認爲 false
update 的第四個參數的意思是是否更新整個集合 默認爲 false
爲何能夠動態參數:
是應爲MongoDB shell 採用的是javascript shell。
限制:傳遞給數據庫查詢文檔的值必須是常量
db.user.find({"firendAge":"this.age"})
不是去查詢文檔firendAge鍵的值等於age鍵的值
而是去查詢 firendAge="this.age" 的值
4.條件查詢
MongoDB的查詢不只能像上面的精確匹配,還能匹配更加複雜的條件好比:範圍、OR字句、取反
4.1範圍查詢
在MongoDB中"$lt","$lte","$gt","$gte"分別表明<,<=,>,>=
問題來了:
1)、我要獲取user集合中的age大於等於23小於100的文檔則怎麼辦呢?
db.user.find({"age":{"$lte":23,"$gt":100}});
2)、咱們要匹配不等怎麼辦
匹配不等的話,就要使用另一個操做符"$ne".("$ne" 是支撐全部的類型的數據)
查詢年齡不是23歲的;查詢名字不叫"jack"的集合
db.user.find({"age":{"$ne":23}});
db.user.find({"name":{"$ne":"jack"}});
3)、如何去匹配日期呢?
瑞然日期在文檔中存儲是精確到毫秒的,可是咱們想獲得一週或者一個月的數據使用範圍查詢就頗有必要
獲取2015-01-01 之後出生的用戶
db.user.find({"birthday":{"ge":(new Date("01/01/2015"))}});
5.OR 查詢
OR 查詢有"$in"和"$or"2種形式
1)、查詢用戶名 爲"jack"或者爲"zsh"
db.user.find({"name":{"$in":["jack","zsh"]}});
不在裏面的話就使用 "$nin"
二、查詢用戶名 爲"jack"或者爲"zsh" 或者年齡爲20
db.user.find({"$or":{"name":{"$in":["jack","zsh"],"age":20}});
6.$not
$not 是元條件語句,既能夠在其餘的條件之上。$mod 取餘運算符。表明將查詢的值除以第一個值,返回的值爲第二個值。
查詢user集合中年齡是除以5餘3的文檔。
db.user.find({"age":{"$mod":[5,3]}});
若想返回其餘的用戶就能夠這樣
db.user.find("age":{"$not",{"$mod":[5,1]}});
7.條件語句
在$開頭的鍵位於不一樣的位置,在查詢語句中$位文檔內層,更新語句"$inc" 則位於文檔外層的鍵。
查詢年齡20-30的用戶
db.user.find({"age":{"$gt":20,"$lt":30}});
更新語句像下面這樣寫就會報錯
db.user.update({},{"$inc":{"age":1},"$set":{"age":20}});
在查詢中也有一些"元操做符"能夠位於文檔外層鍵入"$and","$ro","$nor"使用方法。
db.user.find({"$and":[{"age":{"$gt":10}},{"age":23}]});
可是能夠這樣優化效率會高不少。
db.user.find({"age":{"$gt":10,"$in":[4]}});
8.特定的查詢
1)null
在MongoDB中是沒有"$eq",匹配null不只會查詢指定鍵爲null 的文檔,還會匹配返回不存在該鍵的值
要想查詢user集合中鍵y值爲null的列表是
db.user.find({"y":{"$in":[null],"$exists":true}});
2)正則表達式
正則表達式能夠靈活的匹配字符串。如:查詢全部用戶中名含有joe或者Joe的用戶就可使用正則表達式來匹配。
db.user.find({"name":/^joe/});
正則表達式也能夠被存儲在數據庫中。
9.數組查詢