mongoDB
     MongoDB介绍
         概念
             面向文档的数据库,底层用C++编写,是一个开源的数据库系统
             将数据存储为文档、数据结构为:键值对(key value){name:‘小红’}
             储存模式是json类似是json的bson的格式
         主要特点
             提供一个面向文档的存储方式,操作起来比较简单容易
             支持丰富的查询表达式,可轻易地查询文档内嵌和数组、对象
             支持各种的编程语言(ruby/python/jave/c++/php/c#{chap})
             安装起来比较简单
         数据库文档
             与mysql不同,mongodb不需要固定的表结构
             非关系型数据库中的数据保存在文档内,采用Bson类型的数据来进行存储
             每个数据库下都可以有多个集合,每个集合下有多个文档
         数据库存储的结构
             每个文档都有键值对(key value)来储存
             每个文档可以存储多个键值对,ID唯一
             每个数据库下可以有多个集合,每个集合下有多个文档
         mongodb语言(非sql语言)
             是由国际标准委员会定义的,但不同的数据库采用的语言会有不同的差异
             区分大小写,语句不用分好结尾,语句可以写一行,也可以写多行,驼峰命名的相连单词第一个单词大写(首单词不大写)
         数据类型
             arrays ID
             Object ID
             自生成的_id()每个文档都有一个id标识
                 0-8字是时间戳
                 9-14字是机器标识;表示mongodb所在的机器不同
                 15-18字是进程标识,表示相同机器的不同mongodb的进程
                 19-24字节是计数器
                 例子
                     {_id:1,name:'西门大官人',age:38,house:['beijing','shanghai','sjhenzhen']}
                         单个值
                     {_id:2,name:'韦小宝',age:18,wifi{beijing:'小红',shenzhen:'小绿'}}
                         键值对
         创建集合的相关参数
             capped
                 设置为true,则创建固定集合,达到最大值时会覆盖最早的文档,默认false,固定集合内的文档限制较多
             autoindexid
                 设置为true时,自动在_id字段创建索引,默认为false
             size
                 指定固定集合中包含文档的最大数值
     数据库
         创建数据库
             创建数据库时,如果里边没有集合,mongodb只会将数据库临时放在内存中,只有当里边有了集合,才会保存下来
             使用use时,如果数据库不存在,则创建新的数据库,如果已有数据库,则切换至已有数据库
             概要
                 use 库名
                     有库直接使用
                 use new库名
                     没有库创建新库
                 db.creatCollection('集合名')
     插入insert
         创建集合
             use 库名
             db.creatCollecction('集合名')
         插入insert
             插入单条
                 db.库名.insert([
 {_id:1,name:"艾斯",age:99},
 {_id:2,name:"杰克",age:100}
 ])
             插入多条
                 db.库名.insert([{_id:6,name:"大娃",age:100},{_id:7,name:"二娃",age:100},{_id:8,name:"三娃",age:100},{_id:9,name:"四娃",age:100}])
         插入一条带array的文档
             db.库名.insert({_id:4,name:"聪哥",age:60,house:["beijing","tianjin","mosike","wukelan"]}) (单个值)
         插入一条带object的文档
             db.库名.insert({_id:5,name:"韦小宝",age:18,wife:{"beijing":"双儿","shenzhen":"建宁公主","yunnan":"龙儿"}}) (键值对)
     修改/更新文档update
         使用:update()
 query:更新的条件,类似mysql的where,多个条件可以逗号并列
 update:更新的内容
 options:multi参数:设置为true时表示多条文档更新,false代表符合条件的第一条文档更新,不写multi,代表默认为false。
             更新单条文档
                 update参数内的文档直接覆盖原来的文档,且_id不变
                     把name为二娃的文档改为年龄是101的文档
                     db.库名.update({name:"二娃"},{age:101})
             更新多条文档
                 把age为100岁的名字改为五娃
                 db.库名.update({age:100},{$set:{name:"五娃"}},{multi:true})
         修改器$set/$unset
             $set: 用来指定一个字段,如果这个字段不存在,则创建它。
                 $set增加不存在的字段
                     db.库名.update({age:100},{$set:{address:"葫芦山"}},{multi:true})
                 $set增加年龄为100岁的文档内的address字段
                     db.库名.update({age:100},{$set:{address:"葫芦山"}})
                 指定多条件满足的文档更新。
                     db.库名.update({name:"五娃",age:99},{$set:{address:"葫芦山"}})
             $unset:将指定的字段删除。
                 db.库名.update({age:100},{$unset:{address:"葫芦山"}},{multi:true})
 db.teacher.update({age:100},{$unset:{address:1}})
     保存save()
         save()方法保存文档时,看是否指定_id,如果指定了_id且之前文档有相同的_id则直接覆盖,如果没有指定_id,或者_id没重复,则会新增一条文档
             指定id且不重复
                 db.库名.save({_id:12,name:"钢铁侠",age:40,like:["洗脚","开车","模特"]})
             不指定id
                 db.库名.save({name:"钢铁侠",age:40,like:["音乐","机车","喷漆"]})
             指定id且id重复直接覆盖
                 db.库名.save({_id:1,name:"钢铁侠",age:40,like:["音乐","机车","买房"]})
     删除remove
         删除指定单条件的文档,如果多个文档都满足则全部删除
             db.库名.remove({name:"钢铁侠"})
         删除指定多条件满足的文档。
             db.库名.remove({name:"五娃",age:99})
         删除全部文档
             db.库名.remove({})
     查询find()
         查询集合内所有的文档
             db.库名.find()
             查询集合内指定字段的值
                 单字段查询
                     db.库名.find({},{name:true})
                 多字段查询
                     db.库名.find({},{name:true,age:true})
         条件查询
             运算符$gt/$lt/$gte/$lte/$ne
                 大于:$gt
                     查询年龄大于30岁的文档
                     db.库名.find({age:{$gt:30}})
                 小于:$lt
                     查询年龄小于10岁的文档
                     db.库名.find({age:{$lt:10}})
                 大于等于:$gte
                     查询年龄大于等于30岁的文档
                     db.库名.find({age:{$gte:30}})
                 小于等于:$lte
                     查询年龄小于等于10岁的文档
                     db.库名.find({age:{$lte:10}})
                 不等于:$ne
                     查询年龄不等于10岁的文档
                     db.库名.find({age:{$ne:10}})
                 返回查询结果的前3条数据
                     db.库名.find().limit(3)
             多条件查询
                 and条件查询
                     db.库名.find({age:5,name:'小灰灰'})
                 or条件查询
                     db.库名.find({$or:[{age:5},{address:'青青草原'}]})
         升降序排列
             升序:1
                 db.库名.find().sort({age:1})
             降序:-1
                 db.库名.find().sort({age:-1})
             linit对升序降序的排序
                 查询年龄最大的文档
                     db.shuai.find().sort({age:-1}).limit(1)
         查询结果的统计
             db.库名.find().count()
                 返回指定行数
             查询年龄小于等于30岁的文档
                 db.库名.find({age:{$lt:30}})
             查询年龄年龄大于20岁,不在青青草原的数量
                 db.库名.find({age:{$lt:20}.})
         模糊查询
             查询name中包含羊的文档
                 db.库名.find({name:/羊/})
             查询name中以美开头的文档
                 db.库名.find({name:/^美/})
     去重distinct
         去重,字段名必须加引号
             db.库名.distinct('address')
         单字段排除查询
             db.库名.find({},{name:false})
         多字段排除查询
             db.库名.find({},{name:false,age:false})