离开岛的鱼

学习MongoDB笔记

2017/10/07

版权声明:本文为博主原创文章,未经博主允许不得转载。

为什么要选择mongobg

mongodb是开源的noSQL数据库(NoSQL = Not Only SQL ),也被叫做“芒果数据库”,免费,开源,良好的技术支持。github,淘宝,京东,360,百度都在使用。
NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

1、基本的用法是存储JSON数据,这很适合JavaScript程序。其特性如下:

  • 没有表结构的概念,每条记录可以有完全不同的结构
  • 业务开发方便快捷
  • sql数据库需要事先定义表结构再使用

2、完全支持索引:

  • 单键索引、多建索引
  • 数组索引
  • 地理位置索引

3、方便的冗余和扩展:

  • 数据集保证数据安全
  • 分片扩展数据规模

4、良好的支持:

  • 完善的文档
  • 齐全的驱动支持

搭建简单服务

Mac OX上安装mongodb,mongodb的安装有好多种安装方法,有普通青年的HomeBrew方式,也有文艺青年的源码编译方式。我只想快速的装起来用一下,所以我选最简单的HomeBrew

更新Homebrew的package数据库,在Mac的终端中输入:时间有可能会比较长,没有信息提示,需要耐心等待

$ brew update

开始安装mongodb:然后继续等待mongodb下载完成。这个比较贴心了,有下载进度百分比。

$ brew install mongodb

修改环境变量:

$ touch .base_profile    
$ open .base_profile

加入path,保存

export MONGO_PATH=/usr/local/mongodb
export PATH=$PATH:$MONGO_PATH/bin

启动mongodb服务端:

$ mongod --config /usr/local/etc/mongod.conf
$ mongo

(注:mongod.conf文件中bindIp: 127.0.0.1意思是本机访问,如果是外网访问需要重新设置)如果要修改数据库路径的话,终端输入 mongod –dbpath 路径

此时,可以通过http访问该数据库,mongodb使用了27017端口,因此在浏览器中打开http://localhost:27017/。
出现如下提示即说明连接成功了
images

基本文档的增删改查

操作 说明
show dbs 查看目前有多少数据库
show tables 查看有多少表(集合)
show collections 查看有多少表(集合)
use imooc 切换imooc数据库,没有的话会自动创建
db.imooc_2.insert({x:1}) 在imooc_2表中插入一条数据x等于1(可以使用js语句循环插入数据)
db.imooc_2.find() 查询imooc_2表中所有数据
db.imooc_2.find({x:1}) 查询相等于1 的数据
db.imooc_2.find().count() 计算imooc_2集合中有多少数据
db.imooc_2.find().skip(n) 查询的时候跳过n条数据
db.imooc_2.find().limit(n) 查询的时候限制n条数据
db.imooc_2.find().sort({x:1}) 按x排序
db.imooc_2.find({x:{$gt:100,$lte:120}}) 查找x大于100小于等于120 的数据
db.imooc_2.update({x:1},{x:999}) 把x为1 的数据更新为 999
db.imooc_2.update({z:1},{$set:{x:2}}) 把数据有z为1的数据的x更新为2(及一条数据中的部分更新)
db.imooc_2.update({y:2},{y:999},true) 更新数据库中不存在的数据(及插入一条不存在的数据)
db.imooc_2.update({c:1},{$set:{c:2}},false,true) 更新全部c为1的数据为2,false表示只更新存在的数据,true表示更新全部数据(数据库默认只更新第一条数据)
db.imooc_2.remove({c:2}) 删除c为2的数据(删除是全部的)
db.imooc_2.drop() 删除imooc_2表(集合)
db.dropDatabase() 删除imooc_2数据库

$gt ——– greater than >
$gte ——— gt equal >=
$lt ——– less than <
$lte ——— lt equal <=
$ne ———– not equal !=
$eq ——– equal =

各种类型的索引的创建与使用

优点:加快索引相关查询
缺点:增加磁盘消耗,降低写入性能

操作 说明
自动生成的唯一的 _id索引
db.tbname.ensureIndex({x:1/-1}) 单键索引(1/-1,表示排序)
db.tbname.ensureIndex({x:1,y:-1}) 复合索引
db.tbname.ensureIndex({time: 1},{expireAfterSeconds:30}) 过期索引(登录用户的记录,必须是时间类型 new Date(),不能使用时间搓)
db.page.ensureIndex({title:”text”}) 全文索引
db.page.find({$text:{$search: “aa”}}) 全文索引例子
db.page.find({$text:{$search: “aa -cc”}}) 全文索引例子
db.page.find({$text:{$search: “\”aa\” \”bb\””}}) 全文索引例子
db.page.find({$text:{$search: “aa”}},{score:{$meta:”textScore”}}).sort({score:{$meta:”textScore”}}) 全文索引例子
db.location.ensureIndex({w:’2d’}) 地理位置索引
db.location.find({w:{$near:[1,1]}}) 地理位置例子
db.location.find({w:{$near:[1,1],$maxDistance:10,$minDistance:1}}) 地理位置例子
db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}}) 地理位置例子
db.location.find({w:{$geoWithin:{$center:[[1,1],2]}}}) 地理位置例子
db.location.find({w:{$geoWithin:{$polygon:[[0,0],[2,2],[6,1],[10,10]]}}}) 地理位置例子
db.runCommand({geoNear:”location”,near:[2,2],maxDistance:10,num:2}) 地理位置例子
db.tbname.dropIndex(‘name’) 删除索引
db.tbname.ensureIndex({x:1,y:1,z:1},{name:xyz_index}) 设置索引名字
db.tbname.ensureIndex({x:1},{unique:true}) 设置索引唯一性
db.tbname.ensureIndex({m :1},{sparse:true}) 设置索引洗属性(对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.)