Nosql之Mongodb 2 進階查詢

來源:互聯網
上載者:User
文章目錄
  • find()
  • 限制結果集
  • findOne()
  • limit()
  • 條件操作符 <, <=, >, >=, !=
  • $exists
  • null值的處理
  • $mod
  • $in & $nin
  • $not
  • $or
  • 數組操作
  • count()
  • sort()
  • distinct()
  • skip()
  • 查詢內嵌文檔
  • 使用Regex
  • $where

接上文

http://www.cnblogs.com/zhaoyang/archive/2012/01/09/2317505.html

 

接上文…………

進階查詢find()

1 查詢所有記錄

         db.users.find()

2 查詢name為apple的記錄

         db.users.find({“name”:”apple”})

3 查詢country為china,gender為1的記錄

         db.users.find({“country”:”china”,” gender”:1})

 

限制結果集

對應到標準sql, 之前是select * from, 現在需要的是select name from …

1 查詢name為apple,並且結果只顯示name

         db.users.find({“name”:”apple”}, {“name”:true})

 

---------------------------------------------------------------------------------------------------------------------------

註:後面這個參數{name:true}代表只顯示name,如果有一個設定true,那麼其他未設定的都是預設false,但是_id欄位是預設true的,如果不想顯示_id,可以這麼寫:

db.users.find({“name”:”apple”}, {“name”:true,” _id”:false})

---------------------------------------------------------------------------------------------------------------------------

 

2 查詢所有記錄,並且結果只顯示name和country

         db.users.find(null, {“name”:true, “country”:true, “_id”:false})

findOne()

顧名思義,只顯示查詢到的第一條記錄,類似於select top 1 …

db.users.findOne({“gender”:0})

limit()

類似於sqlserver中的top

         db.users.find({“gender”:0}).limit(2);

條件操作符 <, <=, >, >=, !=

$lt   小於      (less than)

$lte  小於等於  (less than equals)

$gt   大於      (greater than)

$gte  大於等於  (greater than equals)

$ne  不等於    (not equals)

 

查出age大於30的記錄

db.users.find({“age”:{$gt:30}})

查出age>=30 且 <=40的記錄

         db.users.find({“age”:{$gt:30, $lt:40}})

$exists

用於判斷欄位是否存在,比如我們向users集合裡面添加一條記錄,只有name屬性

db.users.insert({name:”testExists”})

 

現在我們查出不存在age欄位的記錄

db.users.find({“age”:{$exists:false}})

 

查出有age欄位但沒有gender欄位的記錄

db.users.find({“age”:{$exists:true},” gender”:{$exists:false}})

null值的處理

需要注意的null與exists的區別

null指的是欄位為空白或者欄位不存在

exists指的是欄位是否存在

 

比較下面兩條記錄

{“name”:null,” age”:44}

{“age”:45}

 

如果使用null查詢  db.xxx.find({name:null}) 則會查出上面兩條記錄

但是我們只想找出存在name欄位並且其為空白的記錄,可以這麼查詢

db.xxx.find({“name”:{$exists:true, $in:[null]}});

 

$mod

模數,比如我們查詢年齡模數10等於1的記錄,應該是年齡為1,11,21,…

db.users.find({“age”:{$mod:[10,1]}})

$in & $nin

這個類似於標準sql的in與not in

 

查詢age為23或者24的記錄

db.users.find({“age”:{$in:[23, 24]}})

 

查詢age不為23或者24的記錄

db.users.find({“age”:{$nin:[23, 24]}})

$not

可以用在任何其他條件之上

db.users.find({$not:{“age”:{$gt:25}}})

$or

查詢年齡為32或者name為zhangsan的記錄

db.users.find({$or:[{“name”:”zhangsan”}, {“age”:32}]})

數組操作

假設我們有下面兩個document

${“name”:”zhangsan”,” booksNumber”:[101, 102, 103]}

${“name”:”lisi”, “booksNumber”:[101, 103]}

$all

db.users.find({“booksNumber”:{$all:[101, 102]}});

那麼就能查出第一條記錄,它需要滿足裡面所有的條件

$size

我們需要查詢只有booksNumber裡面只有兩個的記錄

db.users.find({“booksNumber”:{$size:2}})

count()

查詢總記錄數

db.users.find().count()

 

註:如果我們使用了limit

db.users.find().limit(3).count() 這裡是取前三條記錄,但是調用count()後還是顯示總記錄數,如果我們需要返回被限制後的記錄數

db.users.find().limit(3).count(true)即可

sort()

這也是個顧名思義的操作,排序: 1 代表升序  -1  代表降序

 

按名字進行升序排序

db.users.find().sort({name:1})

 

先按名字升序,再按年齡降序

db.users.find().sort({name:1, age:-1})

distinct()

查詢年齡小於等於50所有的name並去除重複

db.users.distinct(“name”, {“age”:{$lte:50}})

skip()

這一特性通常用於分頁

跳過三條記錄並取之後的三條記錄

db.users.find().skip(3).limit(3)

查詢內嵌文檔

比如要查詢這麼一條記錄:

{ “books”:{“bookid”:100, “bookname”:”english”} }

 

db.users.find({“books.bookid”:100});

使用Regex

使用Regex也是mongodb非常強大的特性

比如我們使用Regex對name進行過濾

db.users.find({“name”:/^[fc]{1}/})

$where

可以使用javascript代碼進行查詢,這使得查詢幾乎能做任何事情

 

db.users.find({$where:function() {

         //this指遍曆到的當前的document

         //根據return true or false來判斷此document是否滿足find的條件

         if(this.name == “zhangsan”) {

                   return true;

         }

         for(var prop in this) {

                   if(this[prop] == “123”) {

                            return true;

                   }

}

return false;

}});

 

下一篇將介紹遊標以及預存程序

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.