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索引,用于存储和查找球面上的点。
例如:
查找距离某个点一定距离内的点。
查找包含在某区域内的点。