MongoDB基础

MongoDB

本文在linux环境下

MongoDB 可以百度找到官网下载

下载解压后可以把bin文件夹直接拷贝到下面所说的文件夹内

mongod文件为mongodb服务器,mongo文件为客户端,mongostat文件用于查看服务器状态

还有其他文件暂不一一解释


搭建简单的MongoDB服务器

创建一个mongodb_test目录(名字可以自己取),进入目录中

创建文件夹data,存放数据

创建文件夹log,存放日志

创建文件夹bin,存放数据库可执行文件

创建文件夹conf,存放配置文件

将mongod复制到bin文件夹下,到conf文件夹下创建配置文件mongod.conf

mongod.conf的内容为

port = 
dbpath = data
logpath = log/mongod.log
fork = true

启动服务器

./bin/mongod -f conf/mongod.conf     指定配置文件

关闭服务器

db.shutdownServer()                 连接服务后使用
kill                                直接kill进程  可以 -15 或者不带选项

关闭服务器 db.shutdownServer()   该命令只能由admin关闭,需要先切换到admin数据库 : use admin



连接数据库

./bin/mongo [options] [ip]:[port]/[dbname]      -u -p 用户名 密码
./bin/mongo 127.0.0.1:12345/test                例子,一开始没有设置用户名密码可以不用打

如果遇到numactl警告,先关闭服务器然后执行

numactl --interleave=all bin/mongod -f conf/mongod.conf

如果遇到以下警告,先关闭服务器然后进入root

Server has startup warnings: 
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] 
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] 
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2016-08-06T15:24:11.110+0800 I CONTROL  [initandlisten] 

进入root账户后

echo "never">/sys/kernel/mm/transparent_hugepage/enabled
echo "never">/sys/kernel/mm/transparent_hugepage/defrag

退出root账户,重新打开服务器,用客户端连进去


简单操作

show dbs  查看当前存在的数据库

use  切换数据库

use imooc  如果数据库不存在,自动创建

db.dropDatabase()  删除数据库

show collections  查看集合    

show tables  查看表

db.imooc_collection.insert({x:1})  插入数据    其中imooc_collection是集合名

for(i=1;i<100;i++)db.imooc_collection.insert({x:i})  插入100条数据

db.imooc_collection.find()  查询数据

db.imooc_collection.find().count()  进行计数

db.imooc_collection.find().skip(3).limit(2).sort({x:1})

skip(3)  过滤调前三条数据

limit(2)  限制返回的条数

sort({x:1})  使用x递增排序ASC,-1时递减排序DESC


关于数据更新 .update

db.imooc_collection.update({x:1},{x:999}) #将x为1的数据更新为x=999

update接收两个参数,第一个是过滤条件,这里是查找x=1的数据,第二个是需要修改的目标值

另一种情况,一条数据包含三个字段值,如

>db.imooc_collection.insert({x:100,y:100,z:100})

如果直接执行>db.imooc_collection.update({z:100},{y:99}) #将z为100的数据中的y更新为99

这样会将x和z覆盖掉,只剩下y:99

为了避免这种情况,需要:

>db.imooc_collection.update({z:100},{$set:{y:99}}) #加入set操作符

set操作符为部分更新操作符,使用set后,内容中存在的字段会被更新,而不存在的字段会保持原状

最好使用$set防止误操作

>db.imooc_collection.update({z:100}, {y:99}, true) #在后面加true:如果查找的数据不存在,则插入一条数据

数据库update防止误操作, 默认只更新一条数据

>db.imooc_collection.update({z:1}, {$set:{y:2}}, false, true)

传入第4参, 进行多数据更新。此处false意义与上面相同:不存在则不添加


数据删除 .remove

>db.imooc_collection.remove({c:2})

数据删除 remove 必须传参数,不传会报错,他默认删除所有查找到的数据

>db.imooc_collection.drop()       #db.表名.drop() 

对于某张表使用删除操作


索引

>db.imooc_collection.getIndexes()

查看集合的索引情况

>db.imooc_collection.ensureIndex({x:1})

用于创建索引,要在使用数据库之前创建,因为耗时比较久占资源,会影响数据库性能

此处x:1为正向递增,x:-1为逆向递减

>db.imooc_2.ensureIndex({x:1,y:1,z:1,m:1},{name:"normal_index"})

自定义索引名称

>db.imooc_2.dropIndex("normal_index")

删除索引时,可以通过我们定义的名字来删除索引

>b.imooc_2.ensureIndex({x:1,y:1},{unique:true})

指定为唯一索引,就不能插入两条x和y值都相同的记录

默认为false

>db.collection.ensureIndex({},{sparse:true/false}) #指定索引是否稀疏

MongoDB索引默认是不稀疏的。

稀疏性的不同代表了MongoDB在处理索引中存在但是文档中不存在的字段的两种不同的方法。

例如,我们为一个collection的x字段指定了索引,但这个collection中可以插入如{y:1,z:1}这种不存在x字段的数据,如果索引为不稀疏的,mongodb依然会为这个数据创建索引,如果在创建索引时指定为稀疏索引,那么就可以避免这件事情发生了。

但是使用稀疏索引有个缺点,在 >db.imooc_2.find({m:{$exists:false}}) 查找不存在m字段的数据时,MongoDB会自动使用不稀疏索引,如果用hint强制使用稀疏索引查找,是找不到数据的,因为稀疏索引中没有不包含m字段的索引。


MongoDB支持的索引类型:

1:_id索引

绝大多数集合默认建立的索引,对于每个插入的数据,MongoDB都会生成一条唯一的_id字段。

2:单键索引

是最普通的索引,与_id索引不同,单建索引不会自动创建

对于已经存在的索引,如果再次的创建会直接返回成功

例  >db.imooc_collection.ensureIndex({x:1})

3:多键索引

多键索引与单键索引创建形式相同,区别在于字段的值。

单键索引:值为一个单一的值,如字符串,数字或日期。

多键索引:值具有多个记录,如数组。

当为一个字段插入的数据是一个数组(集合等表示多条数据就行)时,MongoDB为对应的值,默认创建了一个多键索引

>db.imooc_2.insert({x:[1,2,3]})

4:复合索引

当查询条件不只有一个时,需要建立复合索引

例如{x:1,y:2,z:3}这样一条数据,要按照x与y的值进行查询,就需要创建复合索引。

>db.imooc_2.ensureIndex({x:1,y:1})  #1升序,-1降序

>db.imooc_2.find({x:1,y:2})   #使用复合索引查询 

5:过期索引

在一段时间后会过期的索引

在索引过期后,相应的数据会被删除

适合存储在一段时间之后会失效的数据,比如用户的登录信息、存储的日志等。

>db.imooc_2.ensureIndex({time:1},{expireAfterSeconds:10}) #创建过期索引,time-字段,expireAfterSeconds在多少秒后过期,单位:秒

过期索引的限制:

1. 存储在过期索引字段的值必须是指定的时间类型,必须是ISODate或者ISODate数组,不能使用时间戳,否则不能自动删除。

>db.imooc_2.insert({time:new Date()})  #new Date()自动获取当前时间,ISODate,可以自动删除

例如 >db.imooc_2.insert({time:1}),这种是不能被自动删除的

2. 如果指定了ISODate数组,则按照最小的时间进行删除。

3. 过期索引不能是复合索引。因为不能指定两个过期时间。

4. 删除时间是不精确的。删除过程是由MongoDB的后台进程每60s跑一次的,而且删除也需要一定时间,所以存在误差

6:全文索引

对字符串与字符串数组创建全文可搜索的索引

创建:

>db.articles.ensureIndex({key:"text"}) #key-字段名,value-固定字符串text

上述指令表示,在articles这个集合的key字段上创建了一个全文索引

>db.articles.ensureIndex({key1:"text",key2:"text"}) #在多个字段上创建全文索引

对于nosql数据库,每个记录存储的key可能都是不同的,如果要在所有的key上建立全文索引,一个一个写很麻烦,mongodb可以通过下面指令完成:

>db.articles.ensureIndex({"$**":"text"}) #给所有字段建立全文索引

注意:一个集合只能创建一个全文索引


查询:

>db.article.find({$text:{$search:"coffee"}}) #查询包含coffee的内容的文档

>db.article.find({$text:{$search:"aa bb cc"}}) #(或查询)查询包含aa或bb或cc的内容的文档

>db.article.find({$text:{$search:"aa bb -cc"}}) #-为排除包含有cc内容的文档

>db.article.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}}) #(与查询),\" 转译,查询既包含aa又包含bb又包含cc的内容的文档。 


搜索排序:查询结果与你查询条件越相关的越排在前面。

MongoDB中可以使用$meta操作符完成,格式:

{score:{$meta: "textScore"}}

在全文搜索的格式中加入这样一个条件,如下:

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

搜索出的结果会多出一个score字段,这个得分越高,相关度越高。

还可以对查询出的结果根据得分进行排序:

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

加上.sort方法即可


全文索引的限制:

1. 每次查询,只能指定一个$text查询

2. $text查询不能出现在$nor查询中

3. 查询中如果包含了$text, hint不再起作用

4. MongoDB全文索引还不支持中文(视频是2014年出的,目前想实现的话需要分词)

http://ask.csdn.net/questions/233982

7:地理位置索引

地理位置索引概念:

将一些点的位置存储在MongoDB中,创建索引后,可以按照位置来查找其他点。

地理位置索引分为两类:

1.2D索引,用于存储和查找平面上的点。

2.2Dsphere索引,用于存储和查找球面上的点。

例如:

查找距离某个点一定距离内的点。

查找包含在某区域内的点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值