mongodb常见操作

mongodb常见操作


  • MongoDB是目前noSQL中比较火的数据库,优劣势都很明显。
      优势:灵活操作,可扩展性强,使用简单,只要你会js,轻松操作
      劣势:不适合小型项目,放几条数据大小就几十M。数据回滚不方便
  • 启动数据库./mongod --dbpath ~/mongoData/db --port 27017 --logs ~/mongoData/log
      --dbpath 设置数据保存的位置
      --logs 设置数据库操作记录
      --port 数据库启动的端口
  • 辅助工具Robomongo
      超好用的mongodb图形化工具,可以直观的查看数据,也可以直接右键编辑想要修改的数据,这点确实是比较方便的,不过目前有些不爽的地方就是不支持es6
      注意事项:robomongo默认数据每页是50条数据;目前默认查询的最大数据量是16M,一般可通过limit分批操作

基础操作 (增删改查)

  • 新增数据
    db.collectionName.insert()
      插入一条数据的实例如下;然后使用find查询结果,这里可以看到给我们分配了一个 _id 的属性,这是这条数据的位置标识,当然这里也可以在插入的时候增加自己的 _id 字段
    插入数据

    插入结果

  • 修改数据

    1. 基础操作
        db.collection.update(
           <query>,
           <update>,
           {
             upsert: <boolean>,
             multi: <boolean>
           }
        )
    

    query: 查询条件
    update: 更新字段,常用两个操作符为$set:更新字段; $unset:删除某字段
    upsert: 设置为true时,如果没有找到查询条件对应的数据时,就插入这条数据,默认值为false
    multi:设置为true时更新所有查找到的数据,默认值为false,只更新找到的第一条

    eg: 把刚插入的数据年龄修改为12 db.users.update({name: 'jack'}, {$set: {age: 12}})
    eg: 删除用户jack的年龄字段 db.users.update({name: 'jack'}, {$unset: {age: true}})

    后面的参数都很简单的,试一下就ok啦

  • 删除数据
    db.user.remove(<query>)query删除满足条件的数据

  • 查询数据
    db.user.find(<query>, <field>)
    query: 筛选条件,常用的操作符$gt,$lt,$ne,$in等等,这些看一下文档就知道怎么写了
    field: 用来选出所需的数据
    下图为一个简单的查询,查询年龄小于25的护具,并且只需要数据的中的age字段,返回结果如图

    find简单实例

    db.users.find().count() 如需查询满足条件的数据有多少条,在后面加上count进行统计,

    这些都是一些最基本的操作,网上教程很多,推荐基础看一看菜鸟教程,这篇基础讲的很详细


稍复杂的操作

先给出四个collection的数据,然后按操作符按需完成例,==每次操作后均将数据还原==。
数据如下,之后的操作都基于这些数据


users表,用户保存用户信息,保存用户名称,年龄信息
    /* 1 */
    {
        "_id" : ObjectId("592ee1871855e63d5a44e614"),
        "name" : "jack",
        "age" : 24.0
    }

    /* 2 */
    {
        "_id" : ObjectId("592ee2691855e63d5a44e615"),
        "name" : "rose",
        "age" : 27.0
    }

orders表,用于保存订单信息,存有订单总价,订单创建时间,订单状态,订单用户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权威指南》",
                "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表,保存商品信息,存有商品名称,类型,单价,厂商信息
    /* 1 */
    {
        "_id" : ObjectId("592ecb821855e63d5a44e60a"),
        "name" : "iphone 7",
        "type" : "phone",
        "price" : 7000.0,
        "company" : "iphone"
    }

    /* 2 */
    {
        "_id" : ObjectId("592ecb9d1855e63d5a44e60b"),
        "name" : "《javascript权威指南》",
        "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" : "联想"
    }
    

  1. update数组内数据
    需求: 订单ObjectId("592ecb0c1855e63d5a44e609"),追加一本《javascript权威指南》
    方法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"字段更新为当前时间
    $exists: 判断是否存在

    var time = new Date();
    db.orders.update({_id: {$exists: true}}, {$set: {create_time: time}}, {multi: true})
    
  3. aggregate,$match,$project 聚合
    $aggregate: 聚合操作,可以理解为链式操作,将一系列的操作放到一个数组里,依次执行,这玩意经常用到的,
    $match: 通常和aggregate配合使用,其作用是匹配查询条件,和find语句中的第一个查询参数一个作用
    $project: 和find语句中第二个参数效果一样,选出自己所需的字段
    需求:需要订单金额大于10000的订单时间和订单金额数据

    db.orders.aggregate([
        {$match: {amount: {$gt: 10000}}},
        {$project: {
            amount: 1,
            create_time: 1
        }}
    ])
    
  4. $unwind 解璇
    $unwind: 简单的用公式大概就是这个意思了,{key: [v1, v2]} => {key: v1}, {key: v2}
    需求: 拿到订单里面所有类型为book的数据

    db.orders.aggregate([
        {$unwind: '$goods'},
        {$match: {'goods.type': 'book'}}
    ])
    
  5. $skip, $limit,$sort常用于前端的列表页
    $skip: 忽略查询到的数据
    $limit: 限制数据条数
    $sort: 排序
    需求: 假如前端一页展示一条数据,订单总价降序排列,现在需要第二页的数据

    db.orders.aggregate([
        {$sort : { amount : -1}},
        {$skip: 1},
        {$limit: 1}
    ])
    

    ==这里面也有坑的,一定要结合使用场景正确排序==

  6. $group, $sum, $multiply分组统计
    $group: 分组,一般用于统计,可以按字段或者对象分组
    $sum: 累加求和
    $multiply: 乘法,减减乘除等mongo的文档都有,多看看文档
    需求: 统计订单中不同商品的销售额,各个商品出现在订单中的次数

    db.orders.aggregate([
        {$unwind: '$goods'},
        {$group: {
            _id: '$goods.good_id',
            total: {$sum: {$multiply: ["$goods.price", "$goods.number"]}},
            count: {$sum: 1}
        }}
    ])
    
  7. $lookup 联表
    $lookup: 与其他表进行关联,接受四个参数
    from: 需要关联的集合名称
    localField: 本集合的关联字段
    foreignField: 关联的集合字段
    as:将结果做为神马字段,这里返回的是一个数组
    需求,查看年龄大于20的各用户的订单情况

    db.users.aggregate([
        {$match: {age: {$gt: 20}}},
        {$lookup: {
            from: 'orders',
            localField: '_id',
            foreignField: 'user_id',
            as: 'orders'
        }}
    ])
    
  8. $cond
    $cond mongo中的if判断语句
    需求:统计订单成功的总额,判断状态为success的数据

    db.orders.aggregate([
        {$group: {
            _id: null,
            total: {
                $sum: {
                    $cond: {
                        if: {$eq: ["$status", "success"]}, then: "$amount", else: 0
                    }
                 }
             }
        }}
    ])
    
  9. $size 数组长度
    需求:每个订单中有多少不同的额商

    db.orders.aggregate([
        {$project: {
            count: {$size: "$goods"}
        }}
    ])
    
  10. 其他常用的
    $push: 向数组中添加数据
    $max, $min, $avg: 最大最小值, 平均值
    **$dateToString **: 时间格式化
    $concat: 字符串拼接 { $concatArrays: [ [ "hello", " "], [ "world" ] ] } => [ "hello", " ", "world" ]
    $concatArrays: 数组拼接
    $filter: 过滤数组
    $slice: 剪切数组 { $slice: [ [ 1, 2, 3 ], 1, 1 ] } => [ 2 ]
    $and, $or: 与或判断
    ==这些加上比较和运算的操作符基本就是最常用的了,掌握了基本操作没有问题==


小技巧

  1. 在后台添加索引,简单理解就是在数据库不忙的时候执行
    db.collectionName.createIndex(<query>,{background:true})
  2. 将mongo的文档数据导入excel,下图的结果可以直接copy到excel中,格式不会乱
    db.goods.find().map(function(item) {
        return [item.name, item.type, item.price, item.company].join('\t')
    

}).join('\n')
```


结果如下,直接copy到excel就ok啦
  1. 将打包好的数据库移植到另一台pc使用
    第一步:启动mongodb服务器 mongod -port yourPort --dbpath yourPath
    第二步:执行命令 type 数据包|mongorestore --host localhost:yourPort --drop --gzip --archive -vvvv --stopOnError
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容

  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 5,411评论 1 14
  • CREATE TABLE IF NOT EXISTS ecs_order_info (order_id mediu...
    cookie口阅读 15,686评论 0 16
  • 第1章 初涉MySQL 1.1 MySQL文件 (1)MySQL目录结构 (2)MySQL配置向导文件(安装后配置...
    凛0_0阅读 787评论 1 0
  • 2017/3/14 RDBMS:关系型数据库管理系统 关系模型独立于语言 SQL有几种不同类型的语言:数据定义语言...
    ancherl阅读 1,625评论 0 6
  • 目前,处于人生一段艰难的经历。 不如意事常八九。生活要是事事都顺着自己的愿想去进行,那反而人与人之间的矛盾隔阂更深...
    陈皓天阅读 183评论 0 1