Nosql学习

来源:互联网 发布:双色球软件2016破解版 编辑:程序博客网 时间:2024/06/06 11:04

非关系型数据是以键值对的形式存储

目前流行的非关系数据库

CouchDB  

Redis 新浪微博

MongDB 优酷运营数据分析  豆瓣社区  视觉中国网站

Neo4j

HBase

BigTable google

NoSql数据库优缺点

优点:简单的扩展

 (为某条记录扩展一个字段,实际上就是扩展key,value)
快速的读写 低廉的成本灵活的数据模型

缺点:

不提供对sql 的支持..
支持的特性不够丰富
现有的产品不:够成熟

对比:

关系型数据库:库,表,记录
非关系型数据库:库,集合,记录

                  

mongodb 的简介

是C++编写的非关系型数据库  文件存储的格式为BSON一种JSON的扩展
mongodb 的 大纲


1:nosql 的概念(非关系型数据库)

2:非关系型数据库与关系型数据库的一个对比

3:mongodb 的安装

下载:http://www.mongodb.org/downloads
解压安装包————>配置环境变量

4:启动mongodb 数据库,

怎么通过客户端连接数据库,跟mongodb 进行数据交互 

     建立服务端:

1:使用mongod --dbpath="数据存放路径"         

 如: 1:文件为  D:\ mongdbpath   
  2:键入命令----->mongod --dbpath=D:\mongdbpath

2:  默认占用27017 端口对外提供服务


     客户端:

        1:mongo  命令   

mongo ip:port      
如:键入命令----->mongo 192.168.1.100:27017  链接数据库

2:show dbs 查看所有的数据库

如:键入命令----->show dbs 查看所有的数据库

3:db   查看当前窗口在那个数据库下面..

如:键入命令----->db查看当前数据库

 4:创建集合

 4.1:显示创建
db.createCollection("collectionName");
例如:键入命令----->db.createCollection("c1")        
运行结果:{“ok” : 1 }   
    4.2:隐式创建
在创建集合的同时往里面添加数据.
例如:键入命令----->db.c2.insert({name:"wangqiankun",age:31})的

   显示创建的库键入命令----->show collections;


  4.3添加:删除:查询:
    db.collectionName.insert({});
例如:键入命令----->db.c1.insert({name:"banzhang",age:19})
删除:
    db.collectionName.remove({});
例如:键入命令----->db.c1.remove()
查询:
        db.collectionName.find();
例如:键入命令----->db.c1.find()
    //大于: 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}});

不同的玩法:

键入命令----->var i =1+2;
键入命令----->i
3
键入命令----->for(var i = 1;i <=10000;i++){
键入命令----->db.c1.insert({name:"wangqiankun",age:19})
键入命令----->}
键入命令----->

排序分页:
db.customer.find().sort({age:-1}).skip(2).limit(3);
数据的查询多个元素的包含关系
$all ,$in, $nin
多个查询条件的组拼:
查询集合中的文档 ,$or,相当于关系型数据库中的OR,表示或者的关系
$nor
查询包含某个键的文档:
查询集合中的文档 ,$exists,用于查询集合中存在某个键的文档或不存在某个键的文档
游标相当于是一个临时的存储区,它是放在内存当中,查找个某个集合返回记录,我可以把这些
记录放在游标当中,然后我可以迭代游标


更新:
    关系型数据库:update tableName set value  where condition 


    非关系型数据库:
    1:设置更新的条件
    2:设置更新的内容的对象
    3:如果没有符合条件的记录,是否新增一条记录(取值为0/1)
    4: 如果有有多条记录符合,是否全部更新(取值为0/1)
    db.collectionName.update({},{},{},{})
    1: 我更新的时候只更新到一条,且其它的key:value 覆盖掉了
    2:我只更新到一条
   更新集合中的文档,使用 $inc 将集合中name为user1的age加1,其它键不变, $inc表示使某个键值加减指定的数值
   
   删除某个键:db.c1.update({name:”user1”},{$unset:{address:1}},0,1)
5:索引
   索引的是用来加速查询。
   //创建索引  普通索引
   db.collectionName.ensureIndex({key:1})
   //1:新建500w 条记录,在没有建立索引的情况下从500w 条记录当中查找某条记录需要花费多久时间
   //2:在创建了索引之后查找需要花时间


   //唯一索引  怎么新建唯一索引,唯一索引与普通索引有什么区别


   db.collectionName.ensureIndex({key:1},{unique:true})
   在某个key 建立了唯一索引,那么这个对应的值必须唯一。




    


   
       
6:固定集合

db.createCollection(“collectionName”,{capped:true,size:100000,max:100});  


固定集合的概念:固定集合指的是事先创建而且大小固定的集合 。


固定集合的应用场景:聊天记录,日志信息
    淘汰机制:当满足size指定集合大小,不能在继续往固定集合里面添加数据
    固定集合的容量优先..


7:数据备份


备份(mongodump)和恢复(mongorestore)
>mongodump -h dbhost -d dbname -o dbdirectory
-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。


恢复:
恢复数据使用下面的命令:
>mongorestore -h dbhost -d dbname -directoryperdb dbdirectory
-h:MongoDB所在服务器地址
-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
-directoryperdb:备份数据所在位置,例如:c:\data\dump\test
  导入导出:
  mongoexport ,mongoimport
导出数据可以使用命令:
mongoexport -h dbhost -d dbname -c collectionName -o output


参数说明:
-h  数据库地址
-d 指明使用的库
-c 指明要导出的集合
-o 指明要导出的文件名
 导入数据可以使用命令:
mongoimport -h dbhost -d dbname -c collectionname 文件的地址...
参数说明:
-h  数据库地址
-d 指明使用的库
-c 指明要导入的集合
本地的文件地址




 

8:安全认证(权限)
    1:我最少得保证有一个管理员账号(admin 数据库当中的用户都是管理员)
连接到admin 
use  admin  
db.addUser("username","password")
    2: 有了管理员账号,我就可以为其它的数据库分配用户
  2.1:首先需要跳转到被分配的数据库
    db.addUser("username",password,false) //读写
    db.addUser("username",password,true) //只读
    3:需要重新启动mongodb 服务,开启安全检查
    mongod --dbpath=""  --auth (认证)
    4:接下来的客户端连接mongodb ,需要登录才能执行相应的操作.
    db.auth()//认证
    db.logout() //登出            
9:集群(2种方式)
主从复制
1:从节点只做查询的操作
2:当主节点挂机之后,从节点不能自动顶替上来吧。
1:启动主节点   mongod --dbpath="xxx/路径"  --port     --master 

2:启动从节点: mongod --dbpath="xxx/路径"  --port     --slave --source  ip:port
副本集
1:副本集它一般做故障恢复的操作。


我们在实际的应用当中,主从复制与副本集应该结合在一块用


//同一个节点在主从复制当中是从节点,也可以是副本集当中的备份节点。
启动节点1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port 10001 --replSet itcast/localhost:10002  --master


启动节点2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port 10002 --replSet itcast/localhost:10001


启动节点3:  
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port 10003 --replSet itcast/localhost:10001,localhost:10002



初始化节点(只能初始化一次):随便登录一个节点,以10001为例
mongo localhost:10001/admin
db.runCommand({ "replSetInitiate":{  "_id":“itcast",  "members":[   {     "_id":1,     "host":"localhost:10001",      "priority":3   },   {     "_id":2,     "host":"localhost:10002",     "priority":2   },   {     "_id":3,     "host":"localhost:10003",      "priority":1   }  ]}});


10:分布式存储(分片)
概念:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。
有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,
不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。
片键:用来作为数据拆分的依据
画图理解:
见图003
11:使用java 代码调用mongodb (增删改查)

数据类型





java代码的实现

第一步:

jar包的导入mongo-2.10.1.jar

代码:

package cn.itcast.mongo;import java.net.UnknownHostException;import org.bson.types.ObjectId;import org.junit.Test;import com.mongodb.BasicDBObject;import com.mongodb.DB;import com.mongodb.DBCollection;import com.mongodb.DBCursor;import com.mongodb.DBObject;import com.mongodb.Mongo;/** *  * 使用java代码调用mongodb * @author Administrator * */public class MongoDBDao {@Testpublic void add() throws UnknownHostException{//建立起连接Mongo mongo=new Mongo("192.168.1.100", 27017);//根据连接获取到数据库DB db=mongo.getDB("test");//获取数据库下面的某个集合,针对结合进行操作...DBCollection dbCollection=db.getCollection("person");//BasicDBObject dbObject=new BasicDBObject();dbObject.put("title", "奔放洋气有深度,简约时尚国际范");dbObject.put("content","高大上");//{key:value,keyvalue}dbCollection.insert(dbObject);mongo.close();}@Testpublic void del() throws UnknownHostException{Mongo mongo=new Mongo("192.168.1.100", 27017);//根据连接获取到数据库DB db=mongo.getDB("test");//获取数据库下面的某个集合,针对结合进行操作...DBCollection dbCollection=db.getCollection("person");//{}DBObject dbObject=new BasicDBObject();dbCollection.remove(dbObject);}/** * 更新 * @throws UnknownHostException */@Testpublic void update() throws UnknownHostException{Mongo mongo=new Mongo("192.168.1.100", 27017);//根据连接获取到数据库DB db=mongo.getDB("test");//获取数据库下面的某个集合,针对结合进行操作...DBCollection dbCollection=db.getCollection("person");//{}//设置更新的条件BasicDBObject query = new BasicDBObject("_id",new ObjectId("53db556a5bcbcfc947854027"));//设置更新的内容的对象...BasicDBObject object = (BasicDBObject) dbCollection.findOne(query);object.put("title", "高端大气上档次");dbCollection.update(query, object);}@Testpublic void find() throws UnknownHostException{Mongo mongo=new Mongo("192.168.1.100", 27017);//根据连接获取到数据库DB db=mongo.getDB("test");//获取数据库下面的某个集合,针对结合进行操作...DBCollection dbCollection=db.getCollection("person");//BasicDBObject dbObject=new BasicDBObject();//dbObject.put("content", "高大上");DBCursor cursor=dbCollection.find();while(cursor.hasNext()){DBObject dbObject2=cursor.next();System.out.println(dbObject2.toString());}//{$lt:{age:20}}//db.collection.find()//{}BasicDBObject basicDBObject=new BasicDBObject();BasicDBObject basicDBObject2=new BasicDBObject();basicDBObject2.put("age", 20);basicDBObject.put("$lt",basicDBObject2);}}






0 0