设为首页 收藏本站
查看: 1295|回复: 0

[经验分享] MongoDB初窥

[复制链接]

尚未签到

发表于 2015-7-5 13:05:58 | 显示全部楼层 |阅读模式
NoSql,一种应对纯动态网站的超大规模和高并发需求的东东,目前正得到非常迅猛的发展。对其最为常见的解释是“non-relational”或者说是“Not Only SQL”,非关系型数据库。NoSql的种类很多,有列存储型、图存储型、对象存储型等等。今天主要是初窥MongoDB,文档存储型的NoSql。

一、  简介

MongoDB中的mongo取自humongous(巨大)的中间部分,结合DB就成了MongoDB这个名词。顾名思义,它的目的主要是用来处理大量数据,解决海量数据存储的同时又具有良好的查询性能。当然,其实它不是为了取代传统关系型数据库,而是对其补充。因为不是所有的数据都需要二维关系及多表对应的存储和查询,例如:文件的海量存储,只需Key与Value形式的存储及查询。

  1、亮点
它有以下几个亮点:
1)Schema-free的文档型数据库。MongoDB的一个库可以有多个Collection(Table),每个Collection是Documents(Records)的集合。Collection和传统关系型数据库的表不同,无需事先定义,随时可以创建。Collection中可以包含具有不同schema的文档记录, 也就是说,上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属性。
2)数据存储使用JSON格式。MongoDB使用JSON的变种BSON(Binary
Serialized Document Notation)作为内部存储,针对它的操作都使用JSON语法风格,客户端提交或接收的数据都使用JSON形式来展现。这样相对于Sql来说,更加直观并容易理解和掌握。
2、适用场景
MongoDB的主要目标是在key-value的存储方式,以及对传统的关系型数据库系统架起一座桥梁,集两者的优势于一身。它适合用于以下场景:
1)网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
2)缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载。
3)高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持。
3、不适用场景
1)要求高度事务性的系统。
2)传统的商业智能应用。
3)复杂的跨文档(表)级联查询。
4、目前正在使用的公司
DSC0000.png

二、  安装和操作

1、      
下载
官网上选择自己想要下载的版本,地址是http://www.mongodb.org/downloads。本人下载的是1.9.0版本(9月7日,2.0.0-rc2版本已经出来)。
2、      
安装
下载好直接解压安装包,即可使用。bin目录下的几个文件说明:


mongo


客户端程序,连接MongoDB


mongod


服务端程序,启动MongoDB


mongodump


备份程序


mongoexport


数据导出程序


mongofiles


GridFS工具,内建的分布式文件系统


mongoimport


数据导入程序


mongorestore


数据恢复程序


mongos


数据分片程序,支持数据的横向扩展


mongostat


监视程序


3、      
启动
通过mongod启动MongoDB,可以用dbpath指定数据存放路径,用logpath指定日志存放路径。
./mongod
–dbpath=data/db –logpath=/home/jiankai/output/mongodb/mongodb.log
如下图所示,这就启动了MongoDB,服务器默认端口为27017。

DSC0001.png


这里启动mongodb的同时,还启动了一个http的服务器,它可以更加直观的检测mongodb的情况。通过浏览器直接访问,默认地址是http://10.20.156.14:28017,里面可以看到一些数据库的基本信息。(10.20.156.14是数据库服务器地址)

DSC0002.png

4、      
链接MongoDB
通过bin目录下的mongo命令,连接已经启动的MongoDB服务。


DSC0003.png
5、      
常用命令
1)查看所有数据库(show
dbs)
      2)创建新的数据库(use
mydb)

         此时的“mydb”数据库并没有真正建立起来,只是表明目前在使用mydb。只有真正插入了数据以后,才正式把库建立起来。

3)获取所有的集合(表)
db.getCollectionNames();
4)插入数据。(ps:这里collName为创建的文档名)
db.collName.insert({name: 'Kane', gender: 'male'});
5)更新数据
db.collName.update({_id:
ObjectId('4df96d7fbc7a05156600e4f2')}, {$set: {name: 'Kane', gender: 'male',weight:111}});

6)删除数据
db.collName.remove({name: 'Kane'});
7)获取集合的文档(记录)数量。
db.collName.count();
8)获取集合的所有文档
db.collName.find();
9)获取集合中性别为male的文档
db.collName.find({gender:'male'});
10)获取集合中性别为男性且体重大于600的文档
db.collName.find({gender:'male',weight:{$gt:600}});
11)展示名字和体重的所有文档
db.collName.find(null,{name:1,weight:1});
12)找出性别为male,体重前2、3名的名字
db.collName.find({gender:
'male'}, {name: 1}).sort({weight:-1}).limit(2).skip(1);
13)计算体重小于600的数量
db.collName.count({weight:{$lt:600}});


三、  Java实践

1、下载mongodb Jar包。
下载地址:https://github.com/mongodb/mongo-java-driver/downloads。
2、导入到Java工程。
3、操作。



DSC0004.gif DSC0005.gif View Code


  1 package com.kane.test;
  2
  3 import java.net.UnknownHostException;
  4 import java.util.List;
  5 import java.util.Set;
  6
  7 import com.mongodb.BasicDBObject;
  8 import com.mongodb.DB;
  9 import com.mongodb.DBCollection;
10 import com.mongodb.DBCursor;
11 import com.mongodb.DBObject;
12 import com.mongodb.Mongo;
13 import com.mongodb.MongoException;
14
15 /**
16  * MongoDB的java基本操作
17  *
18  * @author jiankai.xujk 2011-7-8 下午01:50:15
19  */
20 public class MongoTest {
21
22     private static final String HOST       = "10.20.156.14";
23     private static final int    PORT       = 27017;
24     private static final String USERNAME   = "jiankai";
25     private static final String PASSWORD   = "123456";
26     private static final String DB         = "mydb";
27     private static final String COLLECTION = "mycollection";
28     private static Mongo        connection;
29     private static DB           myDB;
30     private static DBCollection myCollection;
31
32     static {
33         try {
34             connection = new Mongo(HOST, PORT);//建立数据库连接  
35             myDB = connection.getDB(DB);//使用mydb数据库。如果没有指定的数据库,会自动建立。
36             boolean isLogin = myDB.authenticate(USERNAME, PASSWORD.toCharArray());//用户验证  
37             if (isLogin) {
38                 myCollection = myDB.getCollection(COLLECTION);//使用mycollection集合。和数据库一样,如果没有,会自动建立。
39             }
40         } catch (UnknownHostException e) {
41             e.printStackTrace();
42         } catch (MongoException e) {
43             e.printStackTrace();
44         }
45     }
46
47     public static void main(String[] args) {
48         List dbList = connection.getDatabaseNames();//获取所有已存在的数据库名
49         for (String db : dbList) {
50             System.out.println(db);
51         }
52         Set colls = myDB.getCollectionNames(); //获取所有已存在的集合
53
54         //构建数据对象{"_id":{"$oid":"4e1a8f13d4b8077f9ff32231"},"name":"Kane","email":"xjkkane@gmail.com","info":{"gender":"male","weight":60}}
55         BasicDBObject doc = new BasicDBObject();
56         doc.put("name", "Kane");
57         doc.put("email", "xjkkane@gmail.com");
58         BasicDBObject info = new BasicDBObject();
59         info.put("gender", "male");
60         info.put("weight", 60);
61         doc.put("info", info);
62
63         //插入数据
64         myCollection.insert(doc);
65
66         long count = myCollection.getCount();//获取集合中的总文档数
67         DBCursor docs = myCollection.find();//获取集合中所有数据
68         while (docs.hasNext()) {
69             System.out.println(docs.next());
70         }
71
72         //根据姓名查找数据
73         BasicDBObject query = new BasicDBObject();
74         query.put("name", "Kane");
75         DBCursor cur = myCollection.find(query);
76         while (cur.hasNext()) {
77             System.out.println(cur.next());
78         }
79
80         //更新数据
81         BasicDBObject oldDoc = new BasicDBObject();
82         BasicDBObject newDoc = new BasicDBObject();
83         oldDoc.put("name", "Kane");
84         newDoc.put("name", "Jane");
85         myCollection.update(oldDoc, newDoc);
86
87         //删除数据
88         DBObject deleteData = new BasicDBObject();
89         deleteData.put("name", "Kane");
90         myCollection.remove(deleteData);
91
92         myCollection.createIndex(new BasicDBObject("name", 1)); // 在"name"属性上创建升序索引。
93         List indexList = myCollection.getIndexInfo();//查询索引
94         for (DBObject index : indexList) {
95             System.out.println(index);
96         }
97
98         //删除数据库。
99         connection.dropDatabase("mydb");
100     }
101 }
  
  

四、  更多参考

1、         
http://www.mongodb.org/display/DOCS/Tutorial
2、        
http://www.mongodb.org/display/DOCS/Java+Tutorial
3、        
http://www.mkyong.com/tutorials/java-mongodb-tutorials/
4、        
http://api.mongodb.org/java/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83369-1-1.html 上篇帖子: MongoDB 分页查询的方法及性能 下篇帖子: 8天学通MongoDB——第七天 运维技术
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表