標籤:
由於工作需要,筆者這兩天使用了一下MongoDB。真的很不習慣!但是確實好用,命令比mysql和sqlserver簡單很多。在這裡整理一些MongoDB的基本操作命令分享出來。
用戶端的安裝就不說了,筆者是shell通過伺服器串連的MongoDB進行操作的,直接進入正題。
show dbs:顯示資料庫列表
show collections:顯示當前資料庫中的集合(類似關聯式資料庫中的表)
show users:顯示使用者
use <db name>:切換當前資料庫,這和MS-SQL裡面的意思一樣
db.help():顯示資料庫操作命令,裡面有很多的命令
db.foo.help():顯示集合操作命令,同樣有很多的命令,foo指的是當前資料庫下,一個叫foo的集合,並非真正意義上的命令
db.foo.find():對於當前資料庫中的foo集合進行資料尋找(由於沒有條件,會列出所有資料)
db.foo.find( { a : 1 } ):對於當前資料庫中的foo集合進行尋找,條件是資料中有一個屬性叫a,且a的值為1
MongoDB沒有建立資料庫的命令,但有類似的命令。
如:如果你想建立一個“myTest”的資料庫,先運行use myTest命令,之後就做一些操作(如:db.createCollection(‘user‘)),這樣就可以建立一個名叫“myTest”的資料庫。
由於筆者是測試,所以目前用不上增、刪、改的。不過我記得在Mon裡對應的命令應該是insert、drop、update。這些只是針對錶資料。針對資料庫和資料表的沒有接觸就不說了。下面給大家整理的是Mon的條件查詢命令。
find()/findOne()
mongodb資料庫的查詢操作即使用find()或者findOne()函數,也可根據不同的條件進行查詢。查詢的寫法(以find()為例)可以如下:
db.A.find()/db.A.find({})
"{}"是否省略不影響查詢,都表示尋找集合A下的所有文檔。也可以以文檔做條件:db.A.find({"a":1,"b":1}),其中尋找同時滿足屬
性a等於1且屬性b也等於1的文檔,若需要滿足屬性c等於1,可直接添加到文檔中:db.A.find({"a":1,"b":1,"c":1})。
指定鍵的設定
指定鍵的設定即展示,比如某集合有10個屬性,經查詢後只關心集合中文檔的某幾個屬性。如下文檔:
{ "_id" : ObjectId("5018da521781352fe25bf4d2"), "a" : "1", "b" : "1", "c" : "1", "d" : "1", "e" : "1" }
只關係屬性a,b,c可如下設定:
db.A.find({},{"a,":1,"b":1,"c":,"_id":0})
這裡的1和0與文檔中的索引值是不同意義的,這裡的1:表示顯示,0:表示不顯示。其中"_id"鍵預設存在的,需要顯示設定。
結果如下:
{ "a" : "1", "b" : "1", "c" : "1" }
--------------------------------------條件查詢可類比結構化查詢語句SQL--------------------------------------------
條件查詢
條件操作符
"$lt"===================>"<"
"$lte"==================>"<="
"$gt"===================>">"
"$gte"==================>">="
"$ne"===================>"!="
如:某集合B集合中文檔有屬性x值為整數,需尋找10<x<=30的文檔,寫法如下:
db.B.find({"x":{"$gt":10,"$lte":30}})
如:從某集合B中尋找日期屬性day值大於2012/01/01的文檔資料,寫法如下:
db.B.find({"day":{"$gt":new Date("2012/01/01")}})
適合於需要進行日調度、月調度、周調度資料等業務處理範圍的場合。
$in包含/$nin不包含
$in:查詢匹配指定條件值的文檔;
$nin:查詢不匹配指定條件值的文檔;
SQL:寫法:欄位 in (‘值1‘,‘值1‘.....)
mongodb:db.B.find({"x":{"$in":[‘值1‘,‘值2‘,.....]}})
SQL:寫法:欄位 not in (‘值1‘,‘值1‘.....)
mongodb:db.B.find({"x":{"$nin":[‘值1‘,‘值2‘,.....]}})
$in/$nin優點:可指定不同類型條件和值。
$or或查詢
$or:查詢匹配多個條件多個值的文檔;
SQL:寫法:欄位1 = ‘xxx‘ or 欄位2 in ( ‘xxx‘).....
mongodb:db.B.find({"$or":[{"x":{"$in":[‘值1‘,‘值2‘...]}},{"y":"3"}]})
$all匹配所有
比如文檔:
{"name":jack,"age":[1,2,3]}
{"name":jack,"age":[1,4,3]}
db.B.find({"age":{"$all":[2,3]}})結果:{"name":jack,"age":[1,2,3]}
$exists 判斷文件屬性是否存在
db.B.find({"name":{"$exists":true}}) --尋找屬性name存在的文檔
db.B.find({"name":{"$exists":false}}) --尋找屬性name不存在的文檔
屬性值為null情況
如下操作並可知道:
> db.C.find()
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
> db.C.find({"c":null})
{ "_id" : ObjectId("5018fccd1781352fe25bf511"), "a" : "14", "b" : "14" }
{ "_id" : ObjectId("5018fccd1781352fe25bf512"), "a" : "15", "b" : "15" }
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
可見查詢屬性c值為null文檔,包括屬性c值為null、該屬性c不存在兩個部分。若想只查詢屬性c為null的文檔
如下:
> db.C.find({"c":{"$in":[null],"$exists":true}})
{ "_id" : ObjectId("5018fccd1781352fe25bf510"), "a" : "13", "b" : "13", "c" : null }
$not元條件句
可與其他條件配合使用,即不在匹配範圍之內的文檔,下面可見其用法。
$mod模數運算
db.B.find({"age":{"$mod":[5,1]}}) --表示尋找年齡/5餘1的所有文檔
若尋找年齡/5餘1之外的所有文檔,可結合$not運算:
db.B.find({"age":{"$not":{"$mod":[5,1]}}})
Regex
db.B.find({"name":/jack/i})
$size
> db.C.find()
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.find({"b":{"$size":2}})
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
$slice
返回數組的一個子集,即對以某屬性為基礎,返回多少條(範圍)。也可以接受位移值和要返回的元素數量,來返回中間的結果。
> db.C.find()
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("501e71607d4bd700257d8a42"), "a" : "1", "b" : [ 1, 2 ] }
> db.C.findOne({},{"b":{"$slice":[2,3]}})
{ "_id" : ObjectId("501e71557d4bd700257d8a41"), "a" : "1", "b" : [ 3 ] }
> db.C.findOne({},{"b":{"$slice":-2}})
{
"_id" : ObjectId("501e71557d4bd700257d8a41"),
"a" : "1",
"b" : [
2,
3
]
}
$where
即可執行任務javascript作為查詢的一部分。
$where的值可以是function、也可以是字串等等。
db.C.find({"$where":function(){return this.a == "1"}})與db.C.find({"$where":"this.a == ‘1‘"}})
注意:採用$where子句查詢在速度上較常規查詢慢的多。因文檔需要從BSON轉換成javascript對象,然後通過"$where"的運算式來運行。
不用利用索引。可用常規查詢做前置過濾,配置"$where"查詢進行調優,可達到不犧牲效能的要求。
至於多表查詢,目前還沒有用到,以後慢慢研究。條件查詢的到這裡基本也就滿足我的使用了。希望對大家也能有所協助。
MongoDB基本操作命令