MongoDB 入門專欄
http://blog.csdn.net/column/details/19681.html
MongoDB 文檔 CRUD 操作
查詢文檔 基本使用 mongodb 查詢文檔的文法如下:
db.collection_name.find(query, projection) # 以壓縮格式返回資料
db.collection_name.find(query, projection).pretty() # 以易讀格式返回資料
query:可選,使用查詢操作符指定查詢條件;
projection:可選,使用投影操作符指定返回的鍵,如果需要返迴文檔中所有的鍵,只需要省略該參數;
# 查詢 testdb.artciles 集合中的所有文檔
> use testdb
> db.articles.find().pretty()
# 查詢 testdb.articles 集合中 author='assad' 的文檔
> db.atricles.find( { author:'assad' } )
query 條件操作符
操作符 |
含義和文法 |
樣本 |
比較查詢符 |
: |
等於(=); { <key>:<value> } |
db.col.find( { name:'assad' } ) 查詢 name='assad' 的文檔 |
$ne |
不等於(!=); { <key>:{$ne:<value>} } |
db.col.find( { name:{$ne:'assad'} } ) 查詢 name!='assad' 的文檔 |
$lt |
小於(<): { <key>:{$lt:<value>} } |
db.col.find( { score:{$lt:120} } ) 查詢 score>120 的文檔 |
$gt |
大於(>); { <key>:{$gt:<value>} } |
db.col.find( { score:{$gt:120} } ) 查詢 score<120 的文檔 |
$lte |
小於等於(<=); { <key:{$lte:<value>} } |
db.col.find( { score:{$lte:120} } ) 查詢 score<=120 的文檔 |
$gte |
大於等於(>=); { <key>:{$gte:<value>} } |
db.col.find( { score:{$gte:120} } ) 查詢 score>= 120 的文檔 |
邏輯關係查詢符 |
$and |
and 和關係; { $and:[query1, query2] } { query1, query2 } |
db.col.find( { $and:[{city:'guangzhou'}, { score:{$gt:250} }] }) db.col.find( { city:'guangzhou', score:{$gt:250} } 查詢 city='guangzhou' and core>250 的文檔 |
$or |
or 或關係; { $or:[query1, query2] } |
db.col.find( { $or:[{city:'guangzhou'}, { score:{$gt:250 }}] }) 查詢 city='guangzhou' or core>250 的文檔 |
$nor |
nor 異或關係; { $nor:[query1, query2] } |
db.col.find( { $nor:[{city:'guangzhou'}, { score:{$gt:250 }}] }) 查詢 (city='guangzhou' or core<=250) and (city!='guangzhou' and core > 250)的文檔 |
$not |
非關係; { $not:{query} } |
db.col.find( { $not:{city:'guangzhou'} }) 查詢 city!= 'guanhgzhou' 的文檔 |
成員關係查詢符 |
$all |
查詢 key 匹配指定數組中的所有成員的結果; { <key>:{$all:[ array ]} } |
db.col.find( { tages:{$all:['java','cpp','linux']} } ) 查詢 tages 欄位數組中含有 'java','cpp','linux' 全部這些值的文檔 |
$in |
查詢 key 匹配指定數組中任一個成員的結果; { <key>:{$in:[ array ]} } |
db.col.find( { tages:{$in:['java','cpp','linux']} } ) 查詢 tages 欄位數組中含有 'java','cpp','linux' 中任意一個值的文檔 |
$nin |
查詢 key 不匹配指定數組中任一個成員的結果; { <key>:{$in:[ array ]} } |
db.col.find( { tages:{$in:['java','cpp','linux']} } ) 查詢 tages 欄位數組中不含有 'java','cpp','linux' 的文檔 |
. |
查詢 key 指定下標成員,index從0開始; { <key.index>:query} |
db.col.find( { tages.1:‘java’ } ) 查詢 tages 欄位數組第 2 個元素 = ‘java' 的文檔 |
值屬性查詢符 |
$size |
查詢指定長度的數組 { <key>:{$size:value} } |
db.col.find( { tages:{$size:3} } ) 查詢 tages 欄位數組長度為 3 的文檔,可以結合比較查詢符使用 |
$type |
查詢指定類型的 key,具體類型列表見: https://docs.mongodb.com/manual/reference/operator/query/type/index.html { <key> :{$type: typecode} } |
db.col.find( { title:{$type:2 } } ) 查詢 title 類型為 String 的文檔 |
$exits |
查詢指定存在條件的 key 的文檔 { <key>:{$exists:<boolean>} } |
db.col.find( { school:{$exits:false} } ) 查詢不存在 school 欄位的所有文檔 |
null |
其實不是操作符,是作為空白值的預留位置 { <key>:null } {<key>:{$in:[null]} } |
db.col.find( { school:null } ) 查詢 school 欄位不存在,或者 school 欄位值為空白的文檔 db.col.find( { school:{$in:[null], $exists:true} } ) 查詢 school 欄位存在,但是值為空白的文檔 |
$regex |
對字串進行正則匹配,使用perl相容運算式,可以用達到類似 SQL like 子句的效果; { <key>:{$regex:pattern, $options:ops} }
其中 $options 用於修飾 regex,參數如下: -i:忽略大小寫; -x:強制對沒有標註 \n 的字串分行; - s:pattern 中的點號匹配所有字元(包括分行符號); -x:忽略 pattern 中沒有轉義的特殊字元; |
db.col.find( { name:{$regix:"^a*"} } ) db.col.find( { name:/^a*/ } } ) 查詢 name 以 a 開頭的文檔
db.col.find( { name:{$regex: "^a*", $options:'i'}} ) db.col.find( { name:/^a*/i }) 查詢 name 以 a 開頭的文檔,或略大小寫 |
$where |
使用任意 JavaScript 作為查詢的一部分,包括 Js 運算式和 Js 閉包; { $where: javascript-operation } 在Js 運算式中,使用 this,obj 指代每個文檔對象 |
db.col.find( { $where: "this.score > this.salary " } ) db.col.find( { $where: "obj.score = this.salary" } ) db.col.find( { $where:function() {return (this.score > this.salary )} } ) 查詢 col 中所有 score > salary 的文檔; |
> use testdb
# 查詢 testdb.articles 集合中 author="assad" 的文檔
> db.articles.find( { author:'assad' } )
# 查詢 likes > 1000 的文檔
> db.articles.find( { likes:{$gt:1000} } )
# 查詢 likes 大於 1000 ,小於 1500 的文檔
> db.artciles.find( { likes:{$gt:1000, $lt:1500} } )
# 查詢 author="assad" 同時 likes > 2000 的文檔
> db.articles.find( { author:'assad', likes:{$gt:2000} } )
# 查詢 authoer="assad" 或 "vancy" 的文檔
> db.articles.find( { author:{$in:['assad','vancy']} } )
# 查詢 tages 數組同時含有 'java','groovy' 的文檔