mongodb常見操作

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ù)

    插入結(jié)果

  • 修改數(shù)據(jù)

    1. 基礎(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é)果如圖

    find簡單實(shí)例

    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)想"
    }
    

  1. 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}})

  2. $exists
    需求: 將所有訂單的"create_time"字段更新為當(dāng)前時(shí)間
    $exists: 判斷是否存在

    var time = new Date();
    db.orders.update({_id: {$exists: true}}, {$set: {create_time: time}}, {multi: true})
    
  3. 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
        }}
    ])
    
  4. $unwind 解璇
    $unwind: 簡單的用公式大概就是這個(gè)意思了点楼,{key: [v1, v2]} => {key: v1}, {key: v2}
    需求: 拿到訂單里面所有類型為book的數(shù)據(jù)

    db.orders.aggregate([
        {$unwind: '$goods'},
        {$match: {'goods.type': 'book'}}
    ])
    
  5. $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é)合使用場景正確排序==

  6. $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}
        }}
    ])
    
  7. $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'
        }}
    ])
    
  8. $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
                    }
                 }
             }
        }}
    ])
    
  9. $size 數(shù)組長度
    需求:每個(gè)訂單中有多少不同的額商

    db.orders.aggregate([
        {$project: {
            count: {$size: "$goods"}
        }}
    ])
    
  10. 其他常用的
    $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)算的操作符基本就是最常用的了彻坛,掌握了基本操作沒有問題==


小技巧

  1. 在后臺(tái)添加索引子巾,簡單理解就是在數(shù)據(jù)庫不忙的時(shí)候執(zhí)行
    db.collectionName.createIndex(<query>,{background:true})
  2. 將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')
```


結(jié)果如下线梗,直接copy到excel就ok啦
  1. 將打包好的數(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市怠益,隨后出現(xiàn)的幾起案子仪搔,更是在濱河造成了極大的恐慌,老刑警劉巖蜻牢,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烤咧,死亡現(xiàn)場離奇詭異,居然都是意外死亡抢呆,警方通過查閱死者的電腦和手機(jī)煮嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抱虐,“玉大人昌阿,你說我怎么就攤上這事】已” “怎么了懦冰?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谣沸。 經(jīng)常有香客問我刷钢,道長,這世上最難降的妖魔是什么乳附? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任内地,我火速辦了婚禮,結(jié)果婚禮上赋除,老公的妹妹穿的比我還像新娘阱缓。我一直安慰自己,他們只是感情好贤重,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布茬祷。 她就那樣靜靜地躺著,像睡著了一般并蝗。 火紅的嫁衣襯著肌膚如雪祭犯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天滚停,我揣著相機(jī)與錄音沃粗,去河邊找鬼。 笑死键畴,一個(gè)胖子當(dāng)著我的面吹牛最盅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播起惕,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼涡贱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惹想?” 一聲冷哼從身側(cè)響起问词,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘀粱,沒想到半個(gè)月后激挪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锋叨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年垄分,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娃磺。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薄湿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偷卧,到底是詐尸還是另有隱情嘿般,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布涯冠,位于F島的核電站炉奴,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛇更。R本人自食惡果不足惜瞻赶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望派任。 院中可真熱鬧砸逊,春花似錦、人聲如沸掌逛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豆混。三九已至篓像,卻和暖如春动知,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背员辩。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工盒粮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奠滑。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓丹皱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親宋税。 傳聞我的和親對(duì)象是個(gè)殘疾皇子摊崭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載,覺得這篇寫 SQLAlchemy Core杰赛,寫得非常不錯(cuò)呢簸。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,379評(píng)論 1 14
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口閱讀 15,673評(píng)論 0 16
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目錄結(jié)構(gòu) (2)MySQL配置向?qū)募ò惭b后配置...
    凜0_0閱讀 780評(píng)論 1 0
  • 2017/3/14 RDBMS:關(guān)系型數(shù)據(jù)庫管理系統(tǒng) 關(guān)系模型獨(dú)立于語言 SQL有幾種不同類型的語言:數(shù)據(jù)定義語言...
    ancherl閱讀 1,603評(píng)論 0 6
  • 目前,處于人生一段艱難的經(jīng)歷淆攻。 不如意事常八九阔墩。生活要是事事都順著自己的愿想去進(jìn)行,那反而人與人之間的矛盾隔閡更深...
    陳皓天閱讀 180評(píng)論 0 1