mongodb基本操作方法
一、mongodb簡介
mongodb屬於文件型資料庫,儲存的是文件(Bson->json的二進位制化)。我們熟知的MYSQL資料庫,它的資料是以表的形式儲存的,每條記錄都具有相同的結構,這樣使得查詢起來很方便,但是卻增加了空間的壓力;文件型資料庫如mongodb,其資料是以一條條文字的形式儲存,每條資料不需要有相同的結構,這使得具有了良好的靈活性。同時,假如有書籍、書評、書評的回覆等資訊,如果將這些資訊儲存在傳統型資料庫如MYSQL中,至少需要張表,關聯度極其複雜,然而在如mongodb的文件型資料庫中,使用者只需要將其寫在同一個文件中即可。mongodb內部執行引擎為JS直譯器, 把文件儲存成bson結構,在查詢時,轉換為JS物件,並可以通過熟悉的js語法來操作,對於熟悉JS的道友來說,mongodb是一個值得選擇的資料庫
二、mongodb安裝
1.下載mongodb (https://www.mongodb.org )
2.解壓檔案
3.不用編譯,本身就是編譯後的二進位制可執行檔案。
4.啟動mongod服務
進入mongodb的bin目錄下,在命令列鍵入:
mongod --dbpath=e:/mongodb/data --logpath=e:/mongodb/log1.log --fork --port=27017
引數解釋:
mongod 表名你要執行的操作命令型別,有時候mongod命令無效,這時候使用mongod.exe
即可
--dbpath 資料儲存目錄
--logpath 日誌儲存目錄
--fork 執行埠(預設27017)
--port 後臺程式執行
注:只有開啟了mongo服務才可以進行資料庫操作,開啟服務後只需要鍵入mongo就可以進入mongodb操作面板
5.mongodb非常的佔磁碟空間, 剛啟動後要佔3-4G左右,如果你用虛擬機器練習,可能空間不夠,導致無法啟動.可以用 –smallfiles 選項來啟動,將會佔用較小空間 400M左右.
三、mongo入門命令
1.基本操作
1.1: show dbs
檢視當前的資料庫
1.2 use databaseName
選庫
1.2 show tables/collections
檢視當前庫下的collection
1.3 如何建立庫?
Mongodb的庫是隱式建立,你可以use 一個不存在的庫
然後在該庫下建立collection,即可建立庫
1.4 db.createCollection(‘collectionName’)
建立collection
1.5 collection允許隱式建立
Db.collectionName.insert(document);
1.6
db.collectionName.drop()
刪除collection
1.7
db.dropDatabase();
刪除database
2.基本操作增刪改查
2..增: insert
介紹: mongodb儲存的是文件,. 文件是json格式的物件.
語法: db.collectionName.isnert(document);
2.2: 增加單篇文件
Db.collectionName.insert({title:’nice day’});
2.3: 增加單個文件,並指定_id
Db.collectionName.insert({_id:8,age:78,name:’lisi’});
2.4.增加多個文件
db.collectionName.insert(
[
{time:'friday',study:'mongodb'},
{_id:9,gender:'male',name:'QQ'}
]
)
刪:remove
語法: db.collection.remove
(查詢表示式, 選項);
選項是指 {justOne:true/false}
,是否只刪一行, 預設為false
注意
1: 查詢表示式依然是個json物件
2: 查詢表示式匹配的行,將被刪掉.
3: 如果不寫查詢表示式,collections中的所有文件將被刪掉
例1: db.stu.remove({sn:’001’});
刪除stu表中 sn屬性值為’001’的文件
例2: db.stu.remove({gender:’m’,true});
刪除stu表中gender屬性為m的文件,只刪除1行.
3.update
改 update操作
改誰? — 查詢表示式
改成什麼樣? – 新值 或 賦值表示式
操作選項 —– 可選引數
語法: db.collection.update
(查詢表示式,新值,選項);
例:
db.news.update({name:'QQ'},{name:'MSN'});
是指選中news表中,name值為QQ的文件,並把其文件值改為{name:’MSN’},
結果: 文件中的其他列也不見了,改後只有_id和name列了.
即–新文件直接替換了舊文件,而不是修改
如果是想修改文件的某列,可以用$set關鍵字
db.collectionName.update(query,{$set:{name:’QQ’}})
修改時的賦值表示式
$set
修改某列的值
$unset
刪除某個列
$rename
重新命名某個列
$inc
增長某個列
$setOnInsert
當upsert為true時,並且發生了insert操作時,可以補充的欄位.
4.Option
{upsert:true/false,multi:true/false}
Upsert—是指沒有匹配的行,則直接插入該行.(和mysql中的replace一樣)
例:db.stu.update({name:'wuyong'},{$set:{name:'junshiwuyong'}},{upsert:true});
如果有name=’wuyong’的文件,將被修改
如果沒有,將新增此新文件
例:
db.news.update({_id:99},{x:123,y:234},{upsert:true});
沒有_id=99的文件被修改,因此直接插入該文件
multi: 是指修改多行(即使查詢表示式命中多行,預設也只改1行,如果想改多行,可以用此選項)
例:
db.news.update({age:21},{$set:{age:22}},{multi:true});
則把news中所有age=21的文件,都修改
查: find, findOne
語法: db.collection.find(查詢表示式,查詢的列);
Db.collections.find(表示式,{列1:1,列2:1});
例1:db.stu.find()
查詢所有文件 所有內容
例2: db.stu.find({},{gendre:1})
查詢所有文件,的gender屬性 (_id屬性預設總是查出來)
例3: db.stu.find({},{gender:1, _id:0})
查詢所有文件的gender屬性,且不查詢_id屬性
例3: db.stu.find({gender:’male’},{name:1,_id:0});
查詢所有gender屬性值為male的文件中的name屬性
5.查詢表示式:
5.1: 最簡單的查詢表示式
{filed:value}
,是指查詢field列的值為value的文件
5.2: $ne --- != 查詢表示式
{field:{$nq:value}}
作用–查filed列的值 不等於 value 的文件
5.3: $nin --> not in
5.4: $all
語法: {field:{$all:[v1,v2..]}}
是指取出 field列是一個數組,且至少包含 v1,v2值
5.5: $exists
語法: {field:{$exists:1}}
作用: 查詢出含有field欄位的文件
5.6: $nor
{$nor,[條件1,條件2]}
是指 所有條件都不滿足的文件為真返回
5.7:用正則表示式查詢 以”諾基亞”開頭的商品
例:db.goods.find({goods_name:/諾基亞.*/},{goods_name:1});
5.8: 用$where表示式來查詢
例: db.goods.find({$where:'this.cat_id != 3 && this.cat_id != 11'});
注意: 用$where查詢時, mongodb是把bson結構的二進位制資料轉換為json結構的物件,
然後比較物件的屬性是否滿足表示式.
速度較慢
6.Update時可用的操作符
例:
>db.user.insert({name:'lisi',age:12,sex:'male',height:123,area:'haidian'});
->db.user.update({name:'lisi'},{$set:{area:'chaoyang'},$unset:{height:1},$inc:{age:1},$rename:{sex:'gender'}});
> db.user.find();
{ "_id" : ObjectId("51fc01c4f5de93e1f2856e33"), "age" : 13, "area" : "chaoyang", "gender" : "male", "name" : "lisi" }
$setOnInsert ->相當於mysql中的列的預設值
7.宣告遊標:
7.1
var cursor = db.collectioName.find(query,projection);
Cursor.hasNext() ,判斷遊標是否已經取到盡頭
Cursor. Next() , 取出遊標的下1個單元
7.2 用while來循環遊標
> var mycursor = db.bar.find({_id:{$lte:5}})
> while(mycursor.hasNext()) {
... printjson(mycursor.next());
... }
7.3
// 宣告遊標
var cursor = db.goods.find();
// 循環遊標
for(var doc=true;cursor.hasNext();) { printjson(cursor.next());}
也可以簡寫:
for(var cursor=db.goods.find(), doc=true;cursor.hasNext();) { printjson(cursor.next());}
7.4 遊標還有一個迭代函式,允許我們自定義回撥函式來逐個處理每個單元.
cursor.forEach(回撥函式);
例:
> var gettitle = function(obj) {print(obj.goods_name)}
> var cursor = db.goods.find();
> cursor.forEach(gettitle);
7.5 遊標在分頁中的應用
比如查到10000行,跳過100頁,取10行.
一般地,我們假設每頁N行, 當前是page頁
就需要跳過前 (page-1)*N 行, 再取N行, 在mysql中, limit offset,N來實現
在mongo中,用skip(), limit()函式來實現的
如 var mycursor = db.bar.find().skip(9995);
則是查詢結果中,跳過前9995行
查詢第901頁,每頁10條
則是 varmytcursor=db.bar.find().skip(9000).limit(10);
7.6 通過cursor一次性得到所有資料, 並返回陣列.
例:
>var cursor = db.goods.find();
> printjson(cursor.toArray()); //看到所有行
> printjson(cursor.toArray()[2]); //看到第2行
注意: 不要隨意使用toArray()
原因: 會把所有的行立即以物件形式組織在記憶體裡.
可以在取出少數幾行時,用此功能.