啟動方法還是在命令行里輸入命令:
`mongod --dbpath=D:\Projects\mongodb\db`
```
D:\Projects\mongodb\bin>mongod --dbpath=D:\Projects\mongodb\db
```
<!--more-->
發現打不開,原因:
```
2015-06-29T10:13:01.490+0800 W - [initandlisten] Detected unclean shutdown - D:\Projects\mongodb\db\mongod.lock is not empty.
```
先刪掉`D:\Projects\mongodb\db\mongod.lock`即可。重新輸入命令打開。
發現正常:
```
2015-06-29T10:13:31.181+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "D:\Projects\mongodb\db" } }
2015-06-29T10:13:31.994+0800 I NETWORK [initandlisten] waiting for connections on port 27017
2015-06-29T10:13:52.033+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:52691 #1 (1 connection now open)
```
再打開一個新的命令行窗口,輸入mongo即可:
`D:\Projects\mongodb\bin>mongo`
默認打開`test`數據。
先看看昨天存的數據還在不在,集合名詞是person:
```
> db.person.find()
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
```
數據依然存在。
## Insert操作
上一篇也說過,文檔是采用“K-V”格式存儲的,如果大家對JSON比較熟悉的話,我相信學mongodb是手到擒來,我們知道JSON里面Value可能是“字符串”,可能是“數組”,又有可能是內嵌的一個JSON對象,相同的方式也適合于BSON。
常見的插入操作也就兩種形式存在:“單條插入”和“批量插入”。
### 單條插入
先前也說了,mongo命令打開的是一個javascript shell。所以js的語法在這里面都行得通,看起來是不是很牛X。
```
> var data = {"name":"liyi", "age": 20, "address" : {"province" : "hubei", "city" : "wuhan"}, "favourite" : ["music", "movie"]};
> db.person.insert(data);
WriteResult({ "nInserted" : 1 })
```
新增成功。使用了js的語法。再來一條:
```
var stu = {};
stu.name = "lier";
stu.age = 10;
stu.adress = {"province" : "hubei", "city" : "yichang"};
db.person.insert(stu);
```
新增成功。
```
WriteResult({ "nInserted" : 1 })
> db.person.find();
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
{ "_id" : ObjectId("5590ac85c8e4762462ebbab2"), "name" : "liyi", "age" : 20, "address" : { "province" : "hubei", "city" : "wuhan" }, "favourite" : [ "music", "movie" ] }
{ "_id" : ObjectId("5590adecc8e4762462ebbab3"), "name" : "lier", "age" : 10, "adress" : { "province" : "hubei", "city" : "yichang" } }
```
### 批量插入
這玩意跟“單條插入”的差異相信大家應該知道,由于mongodb中沒有提供給shell的“批量插入方法”,沒關系,各個語言的driver都打通了跟mongodb內部的批量插入方法,因為該方法是不可或缺的,如果大家非要模擬下批量插入的話,可以自己寫了for循環,里面就是insert。
## Find操作
日常開發中,我們玩查詢,玩的最多的也就是二類:
```
1) >, >=, <, <=, !=, =
2) And,OR,In,NotIn
```
這些操作在mongodb里面都封裝好了,下面就一一介紹:
1) `"$gt", "$gte", "$lt", "$lte", "$ne", "沒有特殊關鍵字"`,這些跟上面是一一對應的,舉幾個例子。
```
/*查找大于20歲的*/
> db.person.find({"age": {$gt: 20 }})
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
/*查找小于20歲的*/
> db.person.find({"age": {$lt: 20 }})
{ "_id" : ObjectId("5590adecc8e4762462ebbab3"), "name" : "lier", "age" : 10, "adress" : { "province" : "hubei", "city" : "yichang" } }
/*查找等于20歲的*/
> db.person.find({"age": 20})
{ "_id" : ObjectId("5590ac85c8e4762462ebbab2"), "name" : "liyi", "age" : 20, "address" : { "province" : "hubei", "city" : "wuhan" }, "favourite" : [ "music", "movie" ] }
```
2) `"無關鍵字“, "$or", "$in","$nin"` 同樣我也是舉幾個例子
```
/*查找age=18 && adress.city="wuhan"*/
> db.person.find({"age": {$gt: 18 },"address.city" : "wuhan"})
"_id" : ObjectId("5590ac85c8e4762462ebbab2"), "name" : "liyi", "age" : 20, "address" : { "province" : "hubei", "city" : "wuhan" }, "favourite" : [ "music", "movie" ] }
/*查找age=18 || age=22*/
> db.person.find({"age": {$in: [22 , 10]}});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
{ "_id" : ObjectId("5590adecc8e4762462ebbab3"), "name" : "lier", "age" : 10, "adress" : { "province" : "hubei", "city" : "yichang" } }
/*查找age=10 || name="yjc"*/
> db.person.find({$or: [{"age": 10}, {"name" : "yjc"}]});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
{ "_id" : ObjectId("5590adecc8e4762462ebbab3"), "name" : "lier", "age" : 10, "adress" : { "province" : "hubei", "city" : "yichang" } }
```
3) 在mongodb中還有一個特殊的匹配,那就是“正則表達式”,這玩意威力很強的。
```
/*查找name里含有字母c的*/
> db.person.find({"name" : /c+/});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
```
4) 有時查詢很復雜,很蛋疼,不過沒關系,mongodb給我們祭出了大招,它就是`$where`,為什么這么說,是因為`$where`中的value就是我們非常熟悉,非常熱愛的js來助我們一馬平川。
```
> db.person.find({$where : function(){return this.name == "yjc"}});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
```
## Update操作
更新操作無非也就兩種,整體更新和局部更新,使用場合相信大家也清楚。記住第一個參數是條件。
### 整體更新
不知道大家可還記得,我在上一篇使用update的時候,其實那種update是屬于整體更新。
```
db.person.find({"name" : "yjc"});
var where = {"name" : "yjc"};
var model = db.person.findOne(where);
model.age = 25; //重新賦值
model.address = {"city" : "beijing"};
db.person.update(where, model);
```
看運行結果:
```
> db.person.find({"name" : "yjc"});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 22 }
> var where = {"name" : "yjc"};
> var model = db.person.findOne(where);
> model.age = 25;
25
> model.address = {"city" : "beijing"};
{ "city" : "beijing" }
> db.person.update(where, model);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({"name" : "yjc"});
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 25, "address" : { "city" : "beijing" } }
```
說明:findOne與find的區別是,如果存在符合條件的記錄,findOne只返回其中的第一條記錄,而不是返回cursor。當不存在符合條件記錄的時候,findOne返回null。是一種對find的補充。
### 局部更新
有時候我們僅僅需要更新一個字段,而不是整體更新,那么我們該如何做呢?easy的問題,mongodb中已經給我們提供了兩個修改器: `$inc` 和 `$set`。
1) `$inc`修改器
` $inc`也就是increase的縮寫,學過sql server 的同學應該很熟悉,比如我們做一個在線用戶狀態記錄,每次修改會在原有的基礎上自增$inc指定的值,如果“文檔”中沒有此key,則會創建key,下面的例子一看就懂。
```
> db.person.update({"name" : "yjc"}, {$inc : {"age" : 5}}); //age 增加5
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({"name" : "yjc"}); 5
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 30, "address" : { "city" : "beijing" } }
```
2) `$set`修改器
與$inc用法格式一樣,功能是設置為一個新值。
```
>db.person.update({"name" : "yjc"}, {$set : {"age" : 5}}); //age 設置為5
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.person.find({"name" : "yjc"}); 為5
{ "_id" : ObjectId("558fd39d02d9b5bcf004aaf5"), "name" : "yjc", "age" : 5, "address" : { "city" : "beijing" } }
```
### upsert操作
這個可是mongodb創造出來的“詞”,大家還記得update方法的第一次參數是“查詢條件”嗎?
那么這個upsert操作就是說:如果我沒有查到,我就在數據庫里面新增一條,其實這樣也有好處,就是避免了我在數據庫里面判斷是update還是add操作,使用起來很簡單將update的第三個參數設為true即可。
```
db.person.update({"name" : "yjc2"}, {$set : {"age" : 25}}, true); //如果不存在則新增
```
### 批量更新
在mongodb中如果匹配多條,默認的情況下只更新第一條,那么如果我們有需求必須批量更新,那么在mongodb中實現也是很簡單的,在update的第四個參數中設為true即可。例子就不舉了。
## Remove操作
這個操作在上一篇簡單的說過,這里就不贅述了。