1. 程式人生 > >mongodb基本操作方法

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.不用編譯,本身就是編譯後的二進位制可執行檔案。
"alt mongodb 資料夾介紹"
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()
原因: 會把所有的行立即以物件形式組織在記憶體裡.
可以在取出少數幾行時,用此功能.