MongoDB入门

NoSQL(Not Only SQL ),意即不仅仅是SQL ,指的是非关系型的数据库 。是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
关系型数据库中的表都是存储一些结构化的数据,每条记录的字段的组成都一样,即使不是每条记录都需要所有的字段,但数据库会为每条数据分配所有的字段。而非关系型数据库以键值对(key-value)存储,它的结构不固定,每一条记录可以有不一样的键,每条记录可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。

NoSql数据库优缺点

优点:

  • 简单的扩展
  • 快速的读写
  • 低廉的成本
  • 灵活的数据模型

缺点:

  • 不提供对SQL的支持
  • 支持的特性不够丰富(特别是事务)
  • 现有的产品不够成熟

MongoDB简介

MongoDB是用C++语言编写的非关系型数据库。特点是高性能、易部署、易使用,存储数据十分方便,主要特性有:
面向集合存储,易于存储对象类型的数据
模式自由
支持动态查询
支持完全索引,包含内部对象
支持复制和故障恢复
使用高效的二进制数据存储,包括大型对象
文件存储格式为BSON(一种JSON的扩展)

MongoDB常用命令及说明

  • use mydb 切换数据库
  • db.dropDatabase() 删除当前数据库
  • show dbs 查看所有数据库
  • db 查看当前正在使用的数据库
  • show collections 或 show tables 查看当前收据库所有的集合

创建集合

  • db.createCollection(“集合名称”) 显式创建
  • db.集合名称.insert({}) 创建集合并插入数据(隐式创建)

添加

  • db.user.insert({name:"张三",age:18})

查找

  • db.user.find({name:"张三",age:18}) 查找user集合中name为张三,age为18的元素

  • db.user.finOne() 查找user第一个元素

  • db.user.find({name:"张三"},{age:1}) 查询user集合中name为张三的,结果只显示age字段

  • 分页

  • db.customer.count();

  • db.customer.find().count();

  • db.customer.find({age:{$lt:5}}).count();

  • db.customer.find().sort({age:1}); 降序-1

  • db.customer.find().skip(2).limit(3);

  • db.customer.find().sort({age:-1}).skip(2).limit(3);

  • db.customer.find().sort({age:-1}).skip(2).limit(3).count();

  • db.customer.find().sort({age:-1}).skip(2).limit(3).count(0);

  • db.customer.find().sort({age:-1}).skip(2).limit(3).count(1);

  • db.user.find({hobby:{$all:["足球","篮球"})查找user集合中爱好包含足球和篮球的元素

  • db.user.find({id:{$in:{"1","2"})类似mysql中的in

  • db.user.find({id:{$nin:{"1","2"})

  • db.user.find({$or:[{name:"zhangsan"},{age:18}]})name等于张三或者age等于18

  • db.user.find({$nor:[{name:"zhangsan"},{age:18}]})

  • db.customer.find({name:{$exists:1}}) 集合中(存在/不存在)某个字段1存在;0不在

  • //大于: field > value
    db.collection.find({field:{$gt:value}});

  • //小于: field < value
    db.collection.find({field:{$lt:value}});

  • //大于等于: field >= value
    db.collection.find({field:{$gte:value}});

  • //小于等于: field <= value
    db.collection.find({field:{$lte:value}});

  • //不等于: field != value
    db.collection.find({field:{$ne:value}});

删除

  • db.user.remove() 删除user集合中的所有的元素
  • db.user.remove({name:"张三",age:18}) 删除user集合中name为张三,并且age是18的元素

更新

  • db.collection.update(criteria,objNew,upsert,multi)
    参数说明:
  • criteria:用于设置查询条件的对象
  • objNew:用于设置更新内容的对象
  • upsert:如果记录已经存在,更新它,否则新增一个记录,取值为0或1
  • multi:如果有多个符合条件的记录,是否全部更新,取值为0或1
  • 例如:db.c1.update({name:”user1”},{$set:{address:”bj”}},0,1)
  • db.user.update({name:"zhangsan"},{$inc:{age:1}})将集合中name为zhangsan的年龄+1
  • db.user.update({name:”zhangsan”},{$unset:{age:1}},0,1)删除name为zhangsan的元素的键age

索引

  • db.collectionName.ensureIndex({key:1},{unique:true}) 为某个key创建唯一索引
  • db.collectionName.dropIndex({id:1})删除索引

固定集合

  • db.createCollection(“collectionName”,{capped:true,size:100000,max:100})size指定集合大小,单位为KB,max指定文档的数量

备份

  • mongodump -h dbhost -d dbname -o dbdirectory
    将数据库dbname备份到dbdirectory目录下

恢复

  • mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
    将dbdirectory目录下的数据恢复到dbname数据库下

导出

  • mongoexport -h dbhost -d dbname -c collectionName -o file
    将数据库dbname中collectionName 导出到file中

导入

  • mongoimport -h dbhost -d dbname -c collectionname file
    将file中的数据导入到数据库dbname中的collectionName