文章目錄
- 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;
}});
下一篇將介紹遊標以及預存程序