mongo总结

基本

库的基本操作

  1. 创建库

    # 创建并且切换到demo
    use demo;
    
    # 展示当前所在库位置
    db;
    
    # 查看所有数据库
    show dbs;
    

    注意: 我们使用use 创建demo库时,再用 show dbs时,发现没有刚刚创建的demo库,这是因为刚创建的库只有在插入数据后才能显示出来。

  2. 删除数据库

    # 切换到demo库
    use demo;
    # 删除当前的所在库
    db.dropDatabase();
    

增删改查

  1. 条件查询find

    # 为了方便查询先插入一定数量的数据
    for(var i=0; i<100; i++) db.book.insert({"num": i, "name": "ss"+i})
    
    # 查询 num为 99 的那条数据
    db.book.find({num: 99});
    
    # 查询 num 为99 并且只返回name字段(_id 是总是会返回的,所以这里会返回_id和num两个字段的)
    db.book.find({num: 99}, {"name": true});
    
  2. 条件查询 findOne

    有时候我们为了查询数据是否存在,没必要查询出所有的数据,此时我们可以使用findOne 可以节省游标不必要的开销。

    # 查询 num 是否存在小于3的集合、
    db.book.findOne({"num": {$lt: 3}});
    
  3. 分页 limit

    其实mongo里的分页可以借助 limit 来实现的。可以先以某个属性字段进程排序,然后用limit来进行限制条数,达到分页的目的

    # 倒序获取50 - 40 的数据
    db.book.find({num: {$lt: 0}}).sort({num: -1}).limit(10);
    
  4. 修改 update

    # num 为99 ,修改 name 为 hhh99
    db.book.update({"num": 99}, {$set: {"name": "hhh99"}});
    
    # 批量修改多个(一般的首先想到的是下面这样写, 其实是错误的),只会修改第一条数据
    db.book.update({"num": {$lt: 10}}, {$set: {"name": "hhh"}});
    
    # 上面的写法是错误的,那么正确的写法是
    db.book.update({"num": {$lt: 10}}, {$set: {"name": "hhh"}}, {"multi": true});
    
    # output
    > db.book.update({"num": {$lt: 10}}, {$set: {"name": "hhh"}});
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.book.update({"num": {$lt: 10}}, {$set: {"name": "hhh"}}, {"multi": true});
    WriteResult({ "nMatched" : 10, "nUpserted" : 0, "nModified" : 9 })
    

    注意: 批量修改的话,一定不要忘记 {"multi": true}

  5. 删除 remove

    # 删除 num 大于等于 95 的集合
    db.book.remove({"num": {$gte: 95}});
    

高级查询

  1. $gt(大于), $lt(小于), $gte(大于等于), $lte(小于等于), $ne(不等于)

    # 查询num 大于等于 45 小于65 的所有,并且显示name字段
    db.book.find({"num": {$gte: 45, $lt: 65}}, {"name": true});
    
  2. $all 匹配所有
    这个属性跟sql里的in有点类似,但是又不完全一样使用

    # 先在上面的集合中添加几个数据字段数据
    db.book.update({num: 0}, {$set: {"age": [5, 6, 7]}});
    db.book.update({num: 1}, {$set: {"age": [6, 7, 8]}});
    db.book.update({num: 2}, {$set: {"age": [7, 8, 9]}});
    db.book.update({num: 3}, {$set: {"age": [8, 9, 10]}});
    db.book.update({num: 4}, {$set: {"age": [9, 10, 11]}});
    db.book.update({num: 5}, {$set: {"age": [10, 11, 12]}});
    
    # 查询 age 有7和8 的集合
    db.book.find({age: {$all: [7, 8]}});
    # ouput
    > db.book.find({age: {$all: [7, 8]}});
    { "_id" : ObjectId("5a0fd6ffab65c141825ab036"), "num" : 1, "name" : "hhh", "age" : [ 6, 7, 8 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab037"), "num" : 2, "name" : "hhh", "age" : [ 7, 8, 9 ] }
    

    从上面我们可以看出,这里输出的只是7和8都同时存在的,而不是7或者8存在的集合。in 的用法则是或者的关系。

  3. $exist 判断字段是否存在

    在关系型数据库里也有这样关键字,但是mongo里的exist却意义完全不一样,这里只是判断文档里的某个字段是否存在。

    # 查询存在age字段的集合
    db.book.find({"age": {$exists: true}});
    
    # output
    > db.book.find({"age": {$exists: true}});
    { "_id" : ObjectId("5a0fd6ffab65c141825ab035"), "num" : 0, "name" : "hhh", "age" : [ 5, 6, 7 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab036"), "num" : 1, "name" : "hhh", "age" : [ 6, 7, 8 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab037"), "num" : 2, "name" : "hhh", "age" : [ 7, 8, 9 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab038"), "num" : 3, "name" : "hhh", "age" : [ 8, 9, 10 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab039"), "num" : 4, "name" : "hhh", "age" : [ 9, 10, 11 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab03a"), "num" : 5, "name" : "hhh", "age" : [ 10, 11, 12 ] }
    
  4. 如何查询值为null?

    # 添加一个值为 null 的字段
    db.book.update({"num": 0}, {$set: {"size": null}});
    
    # 查询 size 为 null 的数据
    db.book.find({"size": null});
    
    #ouput
    > db.book.find({"size": null});
    { "_id" : ObjectId("5a0fd6ffab65c141825ab035"), "num" : 0, "name" : "hhh", "age" : [ 5, 6, 7 ], "size" : null }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab036"), "num" : 1, "name" : "hhh", "age" : [ 6, 7, 8 ] }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab037"), "num" : 2, "name" : "hhh", "age" : [ 7, 8, 9 ] }
    ...
    可以看出不仅查询出 size 为 null, 还查出来size 不存在的值。所以,null 不仅能查询他自身,还能查询不存在的字段。
    
    # 所以上面还需要再加上一个条件 size 属性存在
    db.book.find({"size": null, "size": {$exists: true}}); 
    或者
    db.book.find({"size": {$in: [null], $exists: true}});
    
  5. $in$nin的用法

    上面提过 $all的用法,必须要求所给出的值一定要存在。这里的$in跟之前学过关系型数据库的in是很相似的。

    # 查询num为 7, 9, 10这三项的数据
    db.book.find({num: {$in: [7, 8, 9]}});
    
    # output
    > db.book.find({num: {$in: [7, 8, 9]}});
    { "_id" : ObjectId("5a0fd6ffab65c141825ab03c"), "num" : 7, "name" : "hhh" }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab03d"), "num" : 8, "name" : "hhh" }
    { "_id" : ObjectId("5a0fd6ffab65c141825ab03e"), "num" : 9, "name" : "hhh" }
    

    $nin的用法则刚好和$in的相反。

  6. 正则表达式

    关系型数据库里有like做到模糊查询,这里mongo可以用正则表达式进行更加强大的模糊查询。

    # 查询 name 为 hhh开头的
    db.book.find({name: /^hhh.*/});
    
    # 查询 name 非 hhh开头的
    db.book.find({name: {$not: /^hh.*/}});
    
  7. $not$ne区别

    $not 一般会与 正则表达式配合使用。$ne一般用于一个确切的值进行相反查询。

  8. count

    根据条件统计数量。

    db.book.count({num: {$gte: 90}});
    
  9. skip 重置记录起点

    也就是跳过前面第几条数据然后向后查询。

    # 以10 为页数 进行分页查询
    db.book.find().skip(0).limit(10);
    db.book.find().skip(10).limit(10);
    db.book.find().skip(20).limit(10);
    ...
    
  10. sort 排序

    # 升序
    db.find.find().sort({num: 1});
    # 降序
    db.find.find().sort({num: -1});
    

索引

  1. 概述

    在关系型数据库里,也有索引这样的概念,这里意思是一样的,都是为了提高查询效率,为一些字段添加索引。

  2. _id 默认主键索引

    当一个文档创建时,默认的主键 _id 就自带了一个索引。

    Note

    In sharded clusters, if you do not use the _id field as the shard key, then your application must ensure the uniqueness of the values in the _id field to prevent errors. This is most-often done by using a standard auto-generated ObjectId.

    上面引用官网的_id 补充说明, _id 可以删除的,但是在分布式的mongo中,默认生成的_id 是可以快速定位到一个节点上查找数据的,也就是最好不要改写_id 的生成规则,而是采用默认的标准即可。

  3. 创建index

    关于createIndex 的接口,可以参考:https://docs.mongodb.com/manual/reference/method/db.collection.dropIndex/

    # 为 book 创建 num字段的索引
    db.book.createIndex({num: 1}, {name: "num_index"});
    

    补充: 上面我们的创建索引时,字段后面的值是一个数字1 ,这里的含义是我们根据该字段的值创建一个升序的索引;如果为-1的话,这里就创建的是降序的索引。 我们还可以创建 "position.age" 这样的多层级的索引。

  4. 查看索引

    db.book.getIndexes();
    
    # output
    > db.book.getIndexes();
    [
            {
                    "v" : 2,
                    "key" : {
                            "_id" : 1
                    },
                    "name" : "_id_",
                    "ns" : "demo.book"
            },
            {
                    "v" : 2,
                    "key" : {
                            "num" : 1
                    },
                    "name" : "num_index",
                    "ns" : "demo.book"
            }
    ]
    
  5. 删除index

    db.book.dropIndex("num_index");
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • //使用配置文件启动(如未设置环境变量需要在安装路径的bin文件夹下运行)mongod --config c:\m...
    Anon_0507阅读 506评论 0 0
  • 一、MongoDB介绍 1、NoSQL:非关系型数据库 在php的世界里,常见的非关系型数据库有memcached...
    宠辱不惊丶岁月静好阅读 628评论 0 3
  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 974评论 0 2
  • mongodb特点其一:自动分片:支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可动态添加额外的机器集群定...
    叫我老村长阅读 874评论 0 0
  • 任何数据库中查询都是最麻烦的,在MongoDB中对于查询的支持非常到位,有关系运算,逻辑运算,数组运算等等首先对于...
    许先森的许阅读 3,026评论 0 1