mongodb学习笔记

显示所有数据库

show databases;

show dbs;

进入数据库(如果没有这个数据库他会自动创建)

use test;

删除数据库(use进入数据库)

db.dropDatabase()

插入数据(use进入数据库,test为表名也就是数据集)

db.test.insert({a:1,b:2,c:3})

查询数据

db.test.find(); --查询全部

db.test.findOne() --查询第一条数据

db.test.find({a:1}) --查询a为1的数据

db.test.find().count() --查询条数

db.test.find().skip(5).limit(10) --查询5条开始一共10条数据

db.test.find(a:{$exists:true}}); --查询文档存在记录

更新操作

db.test.update({a:1,b:2},{z:2}) --更新后只有 {z:2}

db.test.update({a:1,b:2},{$set{b:5}}) --更新后 {a:1,b:5,c:3}

db.test.update({a:1,b:2},{b:5},true) --第三个参数为True时这条数据不存在时添加数据

db.test.update({a:1,b:2},{$set{b:5}},false,true) --更新所有a:1,b:2的数据第四个参数不写默认只更新第一匹配成功的数据

09

删除操作(防止误删除不允许空参数)

db.test.remove({a:1})--删除数据

db.test.drop()--删除表

索引(使用之前就要创建索引,要不严重影响数据性能)

db.test.getIndexes() --查看索引

详讲:下图只有一个索引那就是 "_id"

> db.test.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.test"
        }
]

06

db.test.ensureIndex({x:1}) --创建索引  X代表列1代表方向 x为1正向排序 x为-1反向排序

索引说明:索引可以重复创建,如果存在直接返回成功。

> db.test.ensureIndex({x:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

07

db.test.dropIndex({y:1});  ----删除索引 {y:1}为创建时传入的参数

db.test.dropIndex("normal_index");----删除索引 normal_index为索引名字

23

索引类型:_id索引,单键索引,多键索引,复合索引,过期索引,全文索引,地理位置索引

_id索引:

09

单键索引:

10

插入的数据是单一的值创建的就是单键索引比如下面的代码:

db.test.insert({x:1,y:2,z:3});

多键索引:

11

在表中插入多记录值创建的就是多键索引如下:

db.test.insert({x:[1,2,3,4,5]})

复合索引:

12

创建索引

db.test.ensureIndex({x:1,y:1})

查询条件多个时就使用的是复合索引

db.test.find({x:1,y:2});

过期索引:

13

14

创建索引

db.test.ensureIndex({time:1},{expireAfterSeconds:30});

解析:time:为字段

        expireAfterSeconds:为过期时间单位为秒,过期后会删除在这个期间插入的数据

插入数据(过30秒后这条数据将被删除)

db.test.insert({time:new Date()});

解析:new Date():为当前时间

全文索引(文本索引):一个表只能创建一个全文索引

15

16

17

18

19

解析:key为字段名

          text为固定的值

上图第一句:为Key创建全文索引

        第二句:key_1,key_2创建索引

        第三句:所有字段创建索引

创建索引代码:

db.test.ensureIndex({"y":"text"});

查询代码:

db.test.find({$text:{$search:"dd"}});

解析:$text使用全文搜索

          $search的是值是查询的字段

db.test.find({$text:{$search:"aa bb dd"}});

解析:空格为或查询包含aa  bb  dd的都查询出来

db.test.find({$text:{$search:"aa bb -dd"}});

解析:加负号是不包含dd的

db.test.find({$text:{$search:"\\"aa\\" \\"bb\\" \\"cc\\""}});

解析:加双引号就是既包含aa双包含bb cc

相似度索引查询:

 db.test.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})

解析:score为字段名可以任意写

          $meta:"textScore"反回相似度的值

 配合排序相似度从高到低

 db.test.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}});

索引属性

20

22

db.test.ensureIndex({"y":1,"z":1},{"name":"normal_index"});

24

db.test.ensureIndex({"y":1,"z":1},{unique:true});

解析:使用唯一索引不能插入两条一样的数据

> db.test.ensureIndex({"y":1,"z":1},{unique:true});
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.test.insert({"y":"2","z":"4"});
WriteResult({ "nInserted" : 1 })
> db.test.insert({"y":"2","z":"4","x":"3"});
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 11000,
                "errmsg" : "E11000 duplicate key error collection: test.test ind
ex: y_1_z_1 dup key: { : \"2\", : \"4\" }"
        }
})
>

25

26

在你插入一条数据时没有这个字段默认也会为这个字段创建索引,默认为false,改为true时没有这个字段就不进行创建索引

优点:减少磁盘占用,加快插入速度

缺点:不能使用这个索引查找这个字段不存在的记录

db.test.ensureIndex({"s":1},{sparse:true});

27

db.test.ensureIndex({time:1},{expireAfterSeconds:30});

解析:time:为字段

        expireAfterSeconds:为过期时间单位为秒,过期后会删除在这个期间插入的数据

地理位置索引:

28

29

30

32

36

创建索引与输入数据

db.test.ensureIndex({w:"2d"});
> db.test.insert({w:[180,181]});
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 13027,
                "errmsg" : "point not in interval of [ -180, 180 ] :: caused by
:: { _id: ObjectId('59b7b7002f253102f9f1186b'), w: [ 180.0, 181.0 ] }"
        }
})

31

解析:因为2d取值范围为经度[-180,180]纬度[-90,90]所以超出这个范围会报错

查询

db.test.find({w:{$near:[1,1]}})

解析$near:会查询100个最近的点

db.test.find({w:{$near:[1,1],$maxDistance:10}})

解析$maxDistance:最远距离,上面的例子最远距离为10

db.test.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})

解析$geoWithin查询矩形($box表示矩形)中的点

db.test.find({w:{$geoWithin:{$center:[[0,0],5]}}})

解析:查询圆($center)中的点,上例中0,0是圆心点5为半径

db.test.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1],[7,9]]}}})

解析:查询多变形($polygon)中的点

db.runCommand({geoNear:"test",near:[1,2],maxDistance:10,num:1})

解析:geoNear:的值为表名

        near:的值为一个点

        maxDistance:限制最大距离,上例最大距离为10

        num:返回一个条数据

3337

返回结果解析:

results:表示查询到的数据

             dis:查询到的数据与指定数据的距离

stats:查询的一些参数

            nscanned:表示扫描了哪些数据

            avgDistance:平均距离

            maxDistance:最大的距离

            time:花费的时间

ok:1表示查询成功

38

39

40

41


这个工具就在mongodb安装目录中

查看帮助代码

mongostat --help

参数讲解

-h:IP与端口

-u:用户名

-p:密码

输出字段

insert:     一秒内的插入数

query :     一秒内的查询数

update:     一秒内的更新数

delete:     一秒内的删除数

10条简单的查询可能比一条复杂的查询速度还快, 所以数值的大小,意义并不大。

但至少可以知道,现在是否在处理查询,是否在插入。

如果是slave,数值前往往有一个*, 代表是replicate操作


getmore:    查询时游标(cursor)的getmore操作用处不大

command:    一秒内执行的命令数

比如批量插入,只认为是一条命令。 意义不大。

如果是slave,会显示两个值, local|replicated,通过这两个数值的比较,或许可以看出点问题。

flushes:    一秒内flush的次数 

 一般都是0,或者1,通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。

flush开销是很大的,如果频繁的flush,可能就要找找原因了。

mapped:     

vsize:

res:

这个和你用top看到的一样,mapped, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存。

faults:别被这个名字吓着,大压力下这个数值往往不为0。如果经常不为0,那就该加内存了。

locked:MongoDB就一把读写锁,这里指的是写锁所住的时间百分比。这个数值过大(经常超过10%),那就是出状况了。

idx miss:非常重要的参数, 正常情况下,所有的查询都应该通过索引,也就是idx miss为0。如果这里数值较大,是不是缺少索引。

qr|qw: queue lengths for clients waiting (read|write)

ar|aw: active clients (read|write)

如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。

看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了。

netIn: network traffic in - bits

netOut: network traffic out - bits

网络带宽压力,一般MongoDB,网络不会成为瓶颈

conn: number of open connections

MongoDB为每一个连接创建一个线程,线程的创建和释放也是有开销的。尽量不要让这个数值很大。

repl: 服务器当前状态

    M   - master

    SEC - secondary

    REC - recovering

    UNK - unknown

    SLV - slave   

time: 当前时间

如果在windows下的cmd窗口中执行mongostat命令时,可能由于窗口太窄,监控数据排列较乱而阻碍视觉的情况,大家可以把结果输出到一个txt文件中,然后去查看这个文件,办法是曲折了一些哈哈。

D:\Program Files\MongoDB\binmongostat -n 2 > d:\test.txt 

 打印2行结果到D盘的跟目录下的test.txt中。

mongostat命令的使用:

mongostat --host IP:端口   -u 用户名 -p 密码 --authenticationDatabase=数据库名字

42

43

开启记录

0:关闭,不收集任何数据。
1:收集慢查询数据,默认是100毫秒。
2:收集所有数据
db.setProfilingLevel(2);

开户后数据库中会多一个system.profile表

44

查询级别

db.getProfilingLevel()

查看状态:级别和时间

db.getProfilingStatus()

查看操作记录

db.system.profile.find().sort({$natural:-1}).limit(1)

45

服务启动使用配置方式启动

sc create mongodb binPath= "D:\Program Files\MongoDB\bin\mongod.exe --service -f D:\MongoDB\config\mongodb.conf"
net start MongoDB

然后在配置文件中进行设置,verbose级别最多五个V,V越多记录越详细

46

47

特定查询某一个索引使用情况

db.test.find({z:1}).explain()

MongoDB安全

49

auth开户如果是使用命令启动服务器就在后面加--auth

mongod --dbpath "D:\\MongoDB\\db" --logpath "D:\\MongoDB\\log\\mongodb.log" --logappend --auth  

如果是配置方式启动服务就在配置里面加:

auth=true

开户这个权限验证的时候如果没有创建用户,不使用用户密码也可以登录,如果没有创建用户我们就来创建一个用户

50

db.createUser({user:"luoruiyuan",pwd:"123456",roles:[{role:"userAdmin",db:"admin"},{role:"read",db:"test"}]});

解析:user:用户名,上例用户名为luoruiyuan

          pwe:密码

          roles:角色数组

          role:角色,上例为用户管理角色

          db:这个角色分配给哪个数据库

用户详细讲解与操作请点链接:https://www.luoruiyuan.cn/pages/id-84_uid-2_btid-20.html








(1)