MongoDB學習筆記

      對於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") 登陸後執行

   

MongoDB 查詢

  本篇博客主要包括如下內容:
  一、使用find或者findOne 函數和查詢文檔數據庫執行查詢。
  二、使用$條件查詢實現分爲查詢數據集包含查詢、不等式查詢,以及其餘查詢
  三、查詢返回一個數據庫遊標,遊標只會在你須要時纔會將須要的文檔批量返回。
  四、針對遊標的元數據操做,包括忽略必定數量的結果,或者限定返回結果的數量,或者限定返回結果的數量,以對結果集的排序正則表達式

1.1 find

  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.數組查詢

相關文章
相關標籤/搜索