mongodb常見操作
-
MongoDB是目前noSQL中比較火的數(shù)據(jù)庫,優(yōu)劣勢都很明顯屡限。
??優(yōu)勢:靈活操作,可擴(kuò)展性強(qiáng)炕倘,使用簡單钧大,只要你會(huì)js,輕松操作
??劣勢:不適合小型項(xiàng)目罩旋,放幾條數(shù)據(jù)大小就幾十M啊央。數(shù)據(jù)回滾不方便 - 啟動(dòng)數(shù)據(jù)庫
./mongod --dbpath ~/mongoData/db --port 27017 --logs ~/mongoData/log
??--dbpath 設(shè)置數(shù)據(jù)保存的位置
??--logs 設(shè)置數(shù)據(jù)庫操作記錄
??--port 數(shù)據(jù)庫啟動(dòng)的端口 - 輔助工具Robomongo
??超好用的mongodb圖形化工具,可以直觀的查看數(shù)據(jù)涨醋,也可以直接右鍵編輯想要修改的數(shù)據(jù)瓜饥,這點(diǎn)確實(shí)是比較方便的,不過目前有些不爽的地方就是不支持es6
??注意事項(xiàng):robomongo默認(rèn)數(shù)據(jù)每頁是50條數(shù)據(jù)浴骂;目前默認(rèn)查詢的最大數(shù)據(jù)量是16M乓土,一般可通過limit分批操作
基礎(chǔ)操作 (增刪改查)
- 新增數(shù)據(jù)
db.collectionName.insert()
??插入一條數(shù)據(jù)的實(shí)例如下;然后使用find查詢結(jié)果溯警,這里可以看到給我們分配了一個(gè) _id 的屬性趣苏,這是這條數(shù)據(jù)的位置標(biāo)識(shí),當(dāng)然這里也可以在插入的時(shí)候增加自己的 _id 字段
-
修改數(shù)據(jù)
- 基礎(chǔ)操作
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean> } )
query: 查詢條件
update: 更新字段梯轻,常用兩個(gè)操作符為$set:更新字段食磕; $unset:刪除某字段
upsert: 設(shè)置為true時(shí),如果沒有找到查詢條件對(duì)應(yīng)的數(shù)據(jù)時(shí)檩淋,就插入這條數(shù)據(jù)芬为,默認(rèn)值為false
multi:設(shè)置為true時(shí)更新所有查找到的數(shù)據(jù)萄金,默認(rèn)值為false蟀悦,只更新找到的第一條eg: 把剛插入的數(shù)據(jù)年齡修改為12
db.users.update({name: 'jack'}, {$set: {age: 12}})
eg: 刪除用戶jack的年齡字段db.users.update({name: 'jack'}, {$unset: {age: true}})
后面的參數(shù)都很簡單的,試一下就ok啦
刪除數(shù)據(jù)
db.user.remove(<query>)
query刪除滿足條件的數(shù)據(jù)-
查詢數(shù)據(jù)
db.user.find(<query>, <field>)
query: 篩選條件氧敢,常用的操作符$gt,$lt,$ne,$in等等日戈,這些看一下文檔就知道怎么寫了
field: 用來選出所需的數(shù)據(jù)
下圖為一個(gè)簡單的查詢,查詢年齡小于25的護(hù)具孙乖,并且只需要數(shù)據(jù)的中的age字段浙炼,返回結(jié)果如圖
db.users.find().count()
如需查詢滿足條件的數(shù)據(jù)有多少條份氧,在后面加上count進(jìn)行統(tǒng)計(jì),這些都是一些最基本的操作弯屈,網(wǎng)上教程很多蜗帜,推薦基礎(chǔ)看一看菜鳥教程,這篇基礎(chǔ)講的很詳細(xì)
稍復(fù)雜的操作
先給出四個(gè)collection的數(shù)據(jù)资厉,然后按操作符按需完成例厅缺,==每次操作后均將數(shù)據(jù)還原==。
數(shù)據(jù)如下宴偿,之后的操作都基于這些數(shù)據(jù)
users表湘捎,用戶保存用戶信息,保存用戶名稱窄刘,年齡信息
/* 1 */
{
"_id" : ObjectId("592ee1871855e63d5a44e614"),
"name" : "jack",
"age" : 24.0
}
/* 2 */
{
"_id" : ObjectId("592ee2691855e63d5a44e615"),
"name" : "rose",
"age" : 27.0
}
orders表窥妇,用于保存訂單信息,存有訂單總價(jià)娩践,訂單創(chuàng)建時(shí)間活翩,訂單狀態(tài),訂單用戶id及訂單詳情
/* 1 */
{
"_id" : ObjectId("592ecb0c1855e63d5a44e609"),
"amount" : 22000,
"user_id" : ObjectId("592ee1871855e63d5a44e614"),
"create_time" : ISODate("2017-06-04T04:43:58.769Z"),
"status" : "success"翻伺,
"goods" : [
{
"name" : "《javascript權(quán)威指南》",
"type" : "book",
"price" : 50.0,
"number" : 2,
"good_id" : ObjectId("592ecb9d1855e63d5a44e60b")
},
{
"name" : "iphone 7",
"type" : "phone",
"price" : 7000,
"number" : 3,
"good_id" : ObjectId("592ecb821855e63d5a44e60a")
}
]
}
/* 2 */
{
"_id" : ObjectId("592ecd7b1855e63d5a44e60f"),
"amount" : 4080,
"user_id" : ObjectId("592ee2691855e63d5a44e615"),
"create_time" : ISODate("2017-06-04T04:43:58.769Z"),
"status" : "success"纱新,
"goods" : [
{
"name" : "Moto Z",
"type" : "phone",
"price" : 4000.0,
"number" : 1,
"good_id" : ObjectId("592ecbdf1855e63d5a44e60d")
},
{
"name" : "《shell編程》",
"type" : "book",
"price" : 40.0,
"number" : 2,
"good_id" : ObjectId("592ecbb61855e63d5a44e60c")
}
]
}
/* 3 */
{
"_id" : ObjectId("5932bcd90682be14a892ea13"),
"amount" : 8000.0,
"user_id" : ObjectId("592ee1871855e63d5a44e614"),
"create_time" : ISODate("2017-06-04T04:43:58.769Z"),
"goods" : [
{
"name" : "Moto Z",
"type" : "phone",
"price" : 8000.0,
"number" : 2.0,
"good_id" : ObjectId("592ecbdf1855e63d5a44e60d")
}
]
}
goods表,保存商品信息,存有商品名稱穆趴,類型脸爱,單價(jià),廠商信息
/* 1 */
{
"_id" : ObjectId("592ecb821855e63d5a44e60a"),
"name" : "iphone 7",
"type" : "phone",
"price" : 7000.0,
"company" : "iphone"
}
/* 2 */
{
"_id" : ObjectId("592ecb9d1855e63d5a44e60b"),
"name" : "《javascript權(quán)威指南》",
"type" : "book",
"price" : 55.0,
"company" : "XXX出版社"
}
/* 3 */
{
"_id" : ObjectId("592ecbb61855e63d5a44e60c"),
"name" : "《shell編程》",
"type" : "book",
"price" : 40.0,
"company" : "XXX出版社"
}
/* 4 */
{
"_id" : ObjectId("592ecbdf1855e63d5a44e60d"),
"name" : "Moto Z",
"type" : "phone",
"price" : 4000.0,
"company" : "聯(lián)想"
}
update數(shù)組內(nèi)數(shù)據(jù)
需求: 訂單ObjectId("592ecb0c1855e63d5a44e609")未妹,追加一本《javascript權(quán)威指南》
方法1:db.orders.update({_id: ObjectId("592ecb0c1855e63d5a44e609")}, {$set: {"goods.0.number": 3}})
方法2:db.orders.update({_id: ObjectId("592ecb0c1855e63d5a44e609"), 'goods.good_id': ObjectId("592ecb9d1855e63d5a44e60b")}, {$set: {'goods.$.number': 3}})
-
$exists
需求: 將所有訂單的"create_time"字段更新為當(dāng)前時(shí)間
$exists: 判斷是否存在var time = new Date(); db.orders.update({_id: {$exists: true}}, {$set: {create_time: time}}, {multi: true})
-
aggregate簿废,$match,$project 聚合
$aggregate: 聚合操作,可以理解為鏈?zhǔn)讲僮髀缢瑢⒁幌盗械牟僮鞣诺揭粋€(gè)數(shù)組里族檬,依次執(zhí)行,這玩意經(jīng)常用到的,
$match: 通常和aggregate配合使用化戳,其作用是匹配查詢條件单料,和find語句中的第一個(gè)查詢參數(shù)一個(gè)作用
$project: 和find語句中第二個(gè)參數(shù)效果一樣,選出自己所需的字段
需求:需要訂單金額大于10000的訂單時(shí)間和訂單金額數(shù)據(jù)db.orders.aggregate([ {$match: {amount: {$gt: 10000}}}, {$project: { amount: 1, create_time: 1 }} ])
-
$unwind 解璇
$unwind: 簡單的用公式大概就是這個(gè)意思了点楼,{key: [v1, v2]} => {key: v1}, {key: v2}
需求: 拿到訂單里面所有類型為book的數(shù)據(jù)db.orders.aggregate([ {$unwind: '$goods'}, {$match: {'goods.type': 'book'}} ])
-
$skip, $limit扫尖,$sort常用于前端的列表頁
$skip: 忽略查詢到的數(shù)據(jù)
$limit: 限制數(shù)據(jù)條數(shù)
$sort: 排序
需求: 假如前端一頁展示一條數(shù)據(jù),訂單總價(jià)降序排列掠廓,現(xiàn)在需要第二頁的數(shù)據(jù)db.orders.aggregate([ {$sort : { amount : -1}}, {$skip: 1}, {$limit: 1} ])
==這里面也有坑的换怖,一定要結(jié)合使用場景正確排序==
-
$group, $sum, $multiply分組統(tǒng)計(jì)
$group: 分組,一般用于統(tǒng)計(jì)蟀瞧,可以按字段或者對(duì)象分組
$sum: 累加求和
$multiply: 乘法沉颂,減減乘除等mongo的文檔都有条摸,多看看文檔
需求: 統(tǒng)計(jì)訂單中不同商品的銷售額,各個(gè)商品出現(xiàn)在訂單中的次數(shù)db.orders.aggregate([ {$unwind: '$goods'}, {$group: { _id: '$goods.good_id', total: {$sum: {$multiply: ["$goods.price", "$goods.number"]}}, count: {$sum: 1} }} ])
-
$lookup 聯(lián)表
$lookup: 與其他表進(jìn)行關(guān)聯(lián),接受四個(gè)參數(shù)
from: 需要關(guān)聯(lián)的集合名稱
localField: 本集合的關(guān)聯(lián)字段
foreignField: 關(guān)聯(lián)的集合字段
as:將結(jié)果做為神馬字段铸屉,這里返回的是一個(gè)數(shù)組
需求钉蒲,查看年齡大于20的各用戶的訂單情況db.users.aggregate([ {$match: {age: {$gt: 20}}}, {$lookup: { from: 'orders', localField: '_id', foreignField: 'user_id', as: 'orders' }} ])
-
$cond
$cond mongo中的if判斷語句
需求:統(tǒng)計(jì)訂單成功的總額,判斷狀態(tài)為success的數(shù)據(jù)db.orders.aggregate([ {$group: { _id: null, total: { $sum: { $cond: { if: {$eq: ["$status", "success"]}, then: "$amount", else: 0 } } } }} ])
-
$size 數(shù)組長度
需求:每個(gè)訂單中有多少不同的額商db.orders.aggregate([ {$project: { count: {$size: "$goods"} }} ])
其他常用的
$push: 向數(shù)組中添加數(shù)據(jù)
$max, $min, $avg: 最大最小值, 平均值
**$dateToString **: 時(shí)間格式化
$concat: 字符串拼接{ $concatArrays: [ [ "hello", " "], [ "world" ] ] } => [ "hello", " ", "world" ]
$concatArrays: 數(shù)組拼接
$filter: 過濾數(shù)組
$slice: 剪切數(shù)組{ $slice: [ [ 1, 2, 3 ], 1, 1 ] } => [ 2 ]
$and, $or: 與或判斷
==這些加上比較和運(yùn)算的操作符基本就是最常用的了彻坛,掌握了基本操作沒有問題==
小技巧
- 在后臺(tái)添加索引子巾,簡單理解就是在數(shù)據(jù)庫不忙的時(shí)候執(zhí)行
db.collectionName.createIndex(<query>,{background:true})
- 將mongo的文檔數(shù)據(jù)導(dǎo)入excel,下圖的結(jié)果可以直接copy到excel中小压,格式不會(huì)亂
db.goods.find().map(function(item) { return [item.name, item.type, item.price, item.company].join('\t')
}).join('\n')
```
- 將打包好的數(shù)據(jù)庫移植到另一臺(tái)pc使用
第一步:啟動(dòng)mongodb服務(wù)器mongod -port yourPort --dbpath yourPath
第二步:執(zhí)行命令type 數(shù)據(jù)包|mongorestore --host localhost:yourPort --drop --gzip --archive -vvvv --stopOnError