MongoDB 常用基本命令

mongoDB 数据库

mongoDB 数据库概念

MongoDB的一个实例可以拥有一个或多个相互独立的数据库,每个数据库都有自己的集合。

集合

集合可以看作是拥有动态模式的表。

文档

文档是MongoDB中基本的数据单元,类似关系型数据库表的行。
文档是键值对的一个有序集合。

_id

每个文档都有个特殊的"_id",在文档所属集合中是唯一的。

mongo命令 链接MongoDB 数据库时 会进入 javascript shell

MongoDB自带了一个功能强大的JavaScript Shell,可以用于管理或操作MongoDB。

数据库命名规则

* 1:不能是空串。

* 2:不得含有/、\、?、$、空格、空字符等等,基本只能使用ASCII中的字母和数字 。

* 3:区分大小写,建议全部小写。

* 4:最多为64字节。

* 5:不得使用保留的数据库名,比如:admin,local,config 

注意:数据库最终会成为文件,数据库名就是文件的名称。

集合名称定义规则

  • 1: 不能是空串。

  • 2: 不能包含\0字符(空字符),这个字符表示集合名的结束,也不能包含”$”。

  • 3: 不能以”system.”开头,这是为系统集合保留的前缀

文档的key定义规则

* 1: 不能包含\0字符(空字符),这个字符表示键的结束。
* 2: “.”和“$”是被保留的,只能在特定环境下用。
* 3: 区分类型,同时也区分大小写。
* 4: 键不能重复

注意:文档的键值对是有顺序的,相同的键值对如果有不同顺序的话,也是不同的文档。

数据库操作

显示现有的数据库。

    show dbs

    leyue   0.078GB
    local   0.078GB
    mongo   0.078GB
    mycol   0.078GB
    mydb    0.078GB
    testdb  0.078GB

显示当前使用的数据。


    db

切换当前使用的数据库。

    use leyue

创建数据库

    use 数据库名称
    db.集合名称.insert({"name":"wang wu"})

    创建数据库:MongoDB没有专门创建数据库的语句,可以使用“use” 来使用某个数据库,如果要使用
的数据库不存在,那么将会创建一个,会在真正向该库加入文档后,保存成为文件。

删除数据库

    use 数据库名称
    db.dropDatabase()

集合的操作

创建集合

    创建集合:在MongoDB中不用创建集合,因为没有固定的结构,直接使用db.集合名称.命令 来操作就可
以了。如果非要显示创建集合的话,用:db.createCollecion(“集合名称”);

显示现有的集合

    use leyue

    show collections

insert 可以插入一个用{} 多条数据用[]

    db.userdatas.insert([ {"name":'lisan',"age":23},{"name":"wang wu","age":33} ])
1:MongoDB会为每个没有“_id”字段的文档自动添加一个”_id”字段
2:每个Doc必须小于16MB

删除文档 db.集合.remove()

    db.userdatas.remove({"name":"lisan"})

查看数据库 文档状态 可以看到文档的个数大小 等等信息

    数据库: db.stats()
    文档:db.集合.stats
    db.stats()
    {
        "db" : "leyue",
        "collections" : 4,
        "objects" : 418,
        "avgObjSize" : 110.77511961722487,
        "dataSize" : 46304,
        "storageSize" : 192512,
        "numExtents" : 6,
        "indexes" : 2,
        "indexSize" : 32704,
        "fileSize" : 67108864,
        "nsSizeMB" : 16,
        "extentFreeList" : {
            "num" : 0,
            "totalSize" : 0
        },
        "dataFileVersion" : {
            "major" : 4,
            "minor" : 22
        },
        "ok" : 1
    }

    db.userdatas.stats()
    {
        "ns" : "leyue.userdatas",
        "count" : 11,
        "size" : 1040,
        "avgObjSize" : 94,
        "numExtents" : 1,
        "storageSize" : 8192,
        "lastExtentSize" : 8192,
        "paddingFactor" : 1,
        "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It  remains hard coded to 1.0 for compatibility only.",
        "userFlags" : 1,
        "capped" : false,
        "nindexes" : 1,
        "totalIndexSize" : 8176,
        "indexSizes" : {
            "_id_" : 8176
        },
        "ok" : 1
    }

查看集合中所有的文档

    db.集合名称.find();
    db.userdatas.find()
    { "_id" : ObjectId("59789a56bc629e73c4f09e1c"), "name" : "wang wu", "age" : 45 }
    { "_id" : ObjectId("59789a74bc629e73c4f09e1e"), "name" : "wang wu", "age" : 8 }
    { "_id" : ObjectId("59789ac0bc629e73c4f09e20"), "name" : "wang wu", "age" : 33 }
    { "_id" : ObjectId("597f357a09c84cf58880e40e"), "name" : "u1", "age" : 37 }

文档替换 db.集合名称.update(条件,新的文档);只会修改符合条件的第一个文档。

db.test.update({"age":12},{"address":"北京","name":"老王"})

$set :指定一个字段的值,如果字段不存在,会创建一个.

db.test.update({"name":"u1"},{"$set":{"name":"u2"}},0,1)

$unset :删掉某个字段

db.test.update({"name":"u1"},{"$unset":{"address":1}},0,1)

$push:向已有数组的末尾加入一个元素,要是没有就新建一个数组。

db.test.update({"name":"u1"},{"$push":{"score":2}},0,1)

$each:通过一次$push来操作多个值

db.test.update({"name":"u1"},{"$push":{"score":{"$each":[4,5,6]}}})

save方法

如果文档存在就更新,不存在就新建,主要根据”_id”来判断。

    db.test.save({"name":"li si"})

update

第三个参数 0 表示查找不到,不增加一个文档 1表示查找不到,增加文档
第四个参数 0 表示只更新第一个 1 更新所有查找到的文档
1:只能用在$XXX的操作中
2:最好每次都显示的指定update的第4个参数,以防止服务器使用默认行为

find

find(条件,显示的字段)

db.userdatas.find({},{name:1,_id:0})

比较操作:$lt,$lte,$gt,$gte,$ne

    db.userdatas.find({age:{$gte:35}})
    30<=age<=35
    db.userdatas.find({age:{$lte:35,$gte:30}})

$and:包含多个条件,他们之间为and的关系

    db.userdatas.find({"name":"u5",age:{$gt:33}})
    db.userdatas.find({$and:[{"name":"u5"},{age:{$gt:33}}]})

$or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反

     db.userdatas.find({$or:[{"name":"u5"},{age:{$gt:33}}]})

$not:用作其他条件之上,不能作为顶级查询,后面可跟条件,正则

    db.userdatas.find({age:{$not:{$lt:35}}})
    db.userdatas.find({name:{$not:/wang/}})
    

$mod:将查询的值除以第一个给定的值,如果余数等于等二个值则匹配成功。

    db.userdatas.find({age:{$mod:[10,7]}})
    db.userdatas.find({age:{$not:{$mod:[10,7]}}})

$in :查询一个键的多个值,只要键匹配其中一个即可 , $nin为不包含

    db.userdatas.find({age:{$in:[33,35]}})
    db.userdatas.find({age:{$nin:[33,35]}})

$all:键需要匹配所有的值,用于数组

    db.userdatas.find({score:{$all:[7,4]}})

$exists:检查某个键是否存在,1表示存在,0表示不存在

    db.userdatas.find({"score":{$exists:1}})

null类型:不仅能匹配键的值为null,还匹配键不存在的情况

    db.userdatas.find({score:null})
    db.userdatas.find({name:{$in:[null],$exists:1}})    

正则

    MongoDB使用Perl兼容的正则表达式(PCRE),
    比如: db.users.find({“name”:/sishuok/i}); 
    又比如: db.users.find({“name”:/^sishuok/});

数组搜索

单个元素匹配,就跟前面写条件一样,{key:value}

    db.userdatas.find({score:0})

多个元素匹配,使用$all, {key:{$all:[a,b]}},元素的顺序无所谓

    db.userdatas.find({score:{$all:[2,0]}})

可以使用索引指定查询数组特定位置, {“key.索引号”:value}

    db.userdatas.find({"score.0":7})  索引从0开始

查询某个长度的数组,使用$size

    db.userdatas.find({"score":{$size:4}})

指定子集,使用$slice,正数是前面多少条,负数是尾部多少条,也可以指定偏

移量和要返回的元素数量,比如:$slice:[50,10]

    db.userdatas.find({},{"score":{$slice:2}})
    db.userdatas.find({},{"score":{$slice:-2}})
    db.userdatas.find({},{"score":{$slice:[1,1]}})

可以使用$来指定符合条件的任意一个数组元素,如:{”users.$”:1}

    db.userdatas.find({"score":{$in:[7,4]}},{"score.$":1,name:1})

$elemMatch:要求同时使用多个条件语句来对一个数组元素进行比较判断

    db.userdatas.find({score:{$elemMatch:{$gt:8,$lt:12}}})

查询内嵌文档

1:查询整个内嵌文档与普通查询是一样的 。

2:如果要指定键值匹配,可以使用“.” 操作符,比如:{“name.first”:”a” ,“name.last”:”b”} 。

3:如果要正确的指定一组条件,那就需要使用$elemMatch,以实现对内嵌文档的多个键进行匹配操作。

插入一个文档:
    db.userdatas.update({"name":"u2"},{$set:{wendang:{"yw":80,"xw":90}}})
查询文档:
     db.userdatas.find({"wendang.yw":80})

查询记录条数的命令:count

1,直接使用count()的话,得到的是整个记录的条数。

2,如果要获取按条件查询后记录的条数,需要指定count(true 或者非0 的数)

    db.userdatas.find().count()
    db.userdatas.find().limit(2).count(true)

限制返回的记录条数的命令:limit(要返回的条数)

    db.userdatas.find().limit(2)

限制返回的记录条数起点的命令:skip(从第几条开始返回)

    db.userdatas.find().skip(0).limit(2)

排序的命令:sort({要排序的字段:1为升序,-1为降序})

    db.userdatas.find().sort({age:-1})  
    db.userdatas.find().sort({age:-1}).limit(2)

分页

分页查询:组合使用limit,skipt和sort skip 效率低
当然也可以使用其他方式来分页,比如采用自定义的id,然后根据id来分页

查询给定键的所有不重复的数据,命令:distinct

     语法:db.runCommand({“distinct”:集合名,“key”:”获得不重复数据的字段”});
     db.runCommand({"distinct":"userdatas","key":"age"})

     db.runCommand({"distinct":"userdatas","key":"age"})
    {
        "waitedMS" : NumberLong(0),
        "values" : [
            45,
            8,
            33,
            37,
            78,
            32,
            30,
            20
        ],
        "stats" : {
            "n" : 11,
            "nscanned" : 0,
            "nscannedObjects" : 11,
            "timems" : 0,
            "planSummary" : "COLLSCAN"
        },
        "ok" : 1
    }


游标

1:获取游标,示例如下:

var c = db.users.find();

2:循环游标,可以用集合的方式,示例如下:

   while(c.hasNext()){
         printjson(c.next().文档键);
} 

3:也可以使用forEach来循环,示例如下:


   c.forEach(function(obj){
         print(obj);
}); 

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 目录 查询操作 集合查询方法 find() 查询内嵌文档 查询操作符(内含 数组查询) "$gt" 、"$gte"...
    彩虹之梦阅读 1,009评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,451评论 25 707
  • 一个地方 呆得久了就住进了一座城 没有雨也没有风 每天在一面镜子里醒来 从十二点到十二点 从周一到周日 只活了一秒...
    白发与雪阅读 120评论 0 0
  • 下午一两点钟,只听得从2号床铺传来哭天抢地的哀号声: “我不想起床~” “我被我的床封印啦~” “谁来帮帮我~” ...
    卜小羊阅读 682评论 0 1