Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2810398
  • 博文数量: 1157
  • 博客积分: 13195
  • 博客等级: 上将
  • 技术积分: 8785
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
个人简介

C++,python,热爱算法和机器学习

文章分类

全部博文(1157)

文章存档

2019年(14)

2018年(27)

2017年(73)

2016年(101)

2015年(106)

2014年(240)

2013年(5)

2012年(193)

2011年(155)

2010年(93)

2009年(62)

2008年(51)

2007年(37)

分类: 数据库开发技术

2012-08-02 11:35:45

文章来源:http://hfutxf.iteye.com/blog/646828
公司的项目要求使用的数据库要求是MongoDB,说是分布式的,之前一直没有使用过,没办法,现在必须学会使用,还要求对该数据库进行简单的封装,使业务层不用关心底层数据库实现!
   MongoDB是什么?
引用
   MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
*面向集合存储,易存储对象类型的数据。
*模式自由。
*支持动态查询。
*支持完全索引,包含内部对象。
*支持查询。
*支持复制和故障恢复。
*使用高效的二进制数据存储,包括大型对象(如视频等)。
*自动处理碎片,以支持云计算层次的扩展性
*支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
*文件存储格式为BSON(一种JSON的扩展)
*可通过网络访问

   我现在关心的是如何使用这个数据库。
   从官网上下载最新版本的数据库mongodb-1.4.1到本地,解压后,运行bin目录下的mongod.exe不过需要在命令行下运行,为了方便,写了个bat文件
Java代码  收藏代码
  1. @echo off  
  2. cd bin  
  3. mongod -dbpath "E:\dbdata" run  

只要运行这个bat就可以启动服务器了,默认端口在27017。
    那么客户端呢,自带的客户端是mongo.exe这个程序,直接打开就默认的连接到本地的数据库。下面可以在这个shell里写命令,
    show dbs,列出所有的数据库,use test,使用test这个数据库,怎么创建一个数据库呢?use newdb就可以了,如果newdb存在则不创建,不存在则创建,但这个时候如果继续show dbs发现没有newdb,怎么办,执行show collections 再show dbs发现newdb存在了,原来use newdb并不立即产生,只有在使用这个newdb后才产生.
    同样,现在新建一个集合,使用db.newCol.save({})在创建一个数据后则自动创建这个newCol集合,现在使用show collections可以看见newCol了,save()括号里的是数据对象,是一个json格式的数据,比如我们想存入用户名和密码可以这 样,db.user.save({userName:"testU",userPwd:"123456"}),然后执行db.user.find(),列 出所有记录,{ "_id" : ObjectId("4bcadb0b8a76000000001b08"), "userName" : "testU", "userPwd"
: "123456" },可以看到输出结果也是json格式,因此在使用json的场合很适用。
      想获得帮助,可以使用db.foo.help()列出所有对集合的操作。
      db.foo.remove()是用来删除数据,只删除匹配的对象
      db.foo.update({},{})更新对象,第一个参数是查询对象,第二个是替代的,可以在第二个对象里指定更新哪些字段,要使用$set。
      也可以分页,db.foo.find()有limit和skip2,使用这个2个就可以分页查询了。
      总的来说,使用mongodb可以满足常见的增删改差,但是不能完成复杂的跨表级联查询,mongodb努力使数据变得简单紧凑,因为你可以 db.user.save({userName:"dd"})也可以db.user.save({userName:"ff",pwd:"123"}), 这样第一个数据没有密码,而第二个有密码,2个数据没有关系的。
      我在封装时使用java反射机制,将一个model解读为DBObject格式存储,读数据时一样再反射为model。
       官网提供有javaAPI供下载,使用该API
引用

1 建立连接
要建立MongoDB的连接,你只要指定要连接到的数据库就可以。这个数据库不一定存在,如果不存在,MongoDB会先为你建立这个

库。同时,在连接时你也可以具体指定要连接到的网络地址和端口。下面的是连接本机数据库的一些例子:

Java代码  收藏代码
  1. import com.mongodb.Mongo;   
  2. import com.mongodb.DBCollection;   
  3. import com.mongodb.BasicDBObject;   
  4. import com.mongodb.DBObject;   
  5. import com.mongodb.DBCursor;   
  6. import com.mongodb.MongoAdmin;   
  7.   
  8. Mongo db = new Mongo("mydb");   
  9. Mongo db = new Mongo("localhost""mydb");   
  10. Mongo db = new Mongo("localhost"27017"mydb");   


2 安全验证(非必选)
MongoDB服务可以在安全模式运行,此时任何客户端要连接数据库时需使用用户名和密码。在JAVA中可使用如下方法连接:

Java代码  收藏代码
  1. boolean auth = db.authenticate(userName, password);   


如果用户名密码验证通过,返回值为true,否则为false

3 获取集合列表
每个数据库都存在零个或多个集合,需要时你可以获得他们的列表:

Java代码  收藏代码
  1. Set colls = db.getCollectionNames();   
  2. for(String s : colls){   
  3. System.out.println(s);   
  4. }   


4 获得一个集合
要获得某个特定集合,你可以指定集合的名字,并使用getCollection()方法:

Java代码  收藏代码
  1. DBCollection coll = db.getCollection("testCollection");   


当你获取了这个集合对象,你就可以对数据进行增删查改之类的操作。

5 插入文档
当你获得了一个集合对象,你就可以把文档插入到这个对象中。例如,存在一个JSON式的小文档:
{
"name" : "MongoDB",
"type" : "database",
"count" : 1,
"info" : {
x : 203,
y : 102
}
}
请注意,这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档,并且使用insert()方法方便地将它插入到集

合中。

Java代码  收藏代码
  1. BasicDBObject doc = new BasicDBObject();   
  2. doc.put("name""MongoDB");   
  3. doc.put("type""database");   
  4. doc.put("count"1);   
  5.   
  6. BasicDBObject info = new BasicDBObject();   
  7. info.put("x"203);   
  8. info.put("y"102);   
  9.   
  10. doc.put("info", info);   
  11.   
  12. coll.insert(doc);   


6 使用findOne()查找集合中第一个文档
要查找我们上一步插入的那个文档,可以简单地使用findOne()操作来获取集合中第一个文档。这个方法返回一个单一文档(这是相对于使用DBCursor的find()操作的返回),这对于只有一个文档或我们刚插入第一个文档时很有用,因为此时并不需要使用光标。

Java代码  收藏代码
  1. DBObject myDoc = coll.findOne();   
  2. System.out.println(myDoc);   
返回类似:
{
"_id" : "ac907a1f5b9d5e4a233ed300" ,
"name" : "MongoDB" ,
"type" : 1 ,
"info" : {
"x" : 203 ,
"y" : 102} ,
"_ns" : "testCollection"
}

注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名是以“_”做为开始。

7 加入多种文档
为了做更多有趣的查询试验,让我们向集合中加入多种文档类型,象:
{
"i" : value
} 可以通过循环来实现

Java代码  收藏代码
  1. for(int i = 0; i < 100; i++){   
  2. coll.insert(new BasicDBObject().append("i", i));   
  3. }   


注意我们可以在一个集合中插入不同类型的文档,这就是我们所说的“模式自由”(schema-free)。

8 统计文档数量
使用getCount()方法

Java代码  收藏代码
  1. System.out.println(coll.getCount());   

9 使用光标(cursor)来获取全部文档
为了获取集合中的所有文档,我们可以使用find()方法。这个方法返回一上DBCursor对象,来允许我们将符合查询条件的文档迭代

出来。

Java代码  收藏代码
  1. DBCursor cur = coll.find();   
  2. while(cur.hasNext()){   
  3. System.out.println(cur.next());   
  4. }   

10 在查询中获取单一文档
我们可以创建一个查询,并传递给find()方法来获取集合中所有文档的一个子集。例如,我们想要查询域名为"i",并且值为71的文档:
Java代码  收藏代码
  1. BasicDBObject query = new BasicDBObject();   
  2. query.put("i"71);   
  3. cur = coll.find(query);   
  4. while(cur.hasNext()){   
  5. System.out.println(cur.next());   
  6. }   

11 使用条件查询获取集合
例如,我们想要查询所有i>50的文档:

Java代码  收藏代码
  1. BasicDBObject query = new BasicDBObject();   
  2. query.put("i"new BasicDBObject("$gt"50));   
  3. cur = coll.find(query);   
  4. while(cur.hasNext()){   
  5. System.out.println(cur.next());   
  6. }   
当然,我们也可以做20 < i <= 30的查询

Java代码  收藏代码
  1. BasicDBObject query = new BasicDBObject();   
  2. query.put("i"new BasicDBObject("$gt"20).append("$lte"30));   
  3. cur = coll.find(query);   
  4. while(cur.hasNext()){   
  5. System.out.println(cur.next());   
  6. }   


12 创建索引
MongoDB支持索引,而且很容易在集合上增加索引。要创建索引,只需要指定要加索引的属性,并且指定升序(1)或降序即可(-1)。

Java代码  收藏代码
  1. coll.createIndex(new BasicDBObject("i"1));   

13 获取索引列表

Java代码  收藏代码
  1. List list = coll.getIndexInfo();   
  2. for(DBObject o : list){   
  3. System.out.println(o);   
  4. }   

14 MongoDB管理函数
管理函数在com.mongodb.MongoAdmin类中定义。
例A:获取数据库列表
Java代码  收藏代码
  1. MongoAdmin admin = new MongoAdmin();   
  2. for(String s : admin.getDatabaseNames()){   
  3. System.out.println(s);   
  4. }   


例B:获取数据库对象
Java代码  收藏代码
  1. Mongo m = admin.getDB("mydb");   


例C:删除数据库
Java代码  收藏代码
  1. admin.dropDatabase("mydb");   


15 用DBObject存储JAVA对象
MongoDB for JAVA驱动中提供了用于向数据库中存储普通对象的接口DBObject
例如,存在一个需要存储的对象类Tweet
Java代码  收藏代码
  1. public class Tweet implements DBObject{   
  2. /*...*/   
  3. }   
可以使用如下代码:

Java代码  收藏代码
  1. Tweet myTweet = new Tweet();   
  2. myTweet.put("user", userId);   
  3. myTweet.put("message", message);   
  4. myTweet.put("date"new Date());   
  5.   
  6. collection.insert(myTweet);   


当一个文档从MongoDB中取出时,它会自动把文档转换成DBObject接口类型,要将它实例化为你的对象,需使用

Java代码  收藏代码
  1. DBCollection.setObjectClass()。   
  2. collection.setObjectClass(Tweet);   
  3. Tweet myTweet = (Tweet)collection.findOne();   


16 JAVA驱动的并发性
JAVA的MongoDB驱动是线程安全的。如果你将它用在WEB服务中,可以创建它的一个单例,并在所有请求中使用它。

然而,如果你需要在一个会话(例如HTTP请求)中保证事务一致性,也许你会希望在这个会话中对驱动使用同一个端口。这仅仅在

请求量非常大的环境中,例如你经常会读取刚写入的数据。
为了这一点,你需要使用如下代码:
Java代码  收藏代码
  1. Mongo m;   
  2. m.restartStart();   
  3.   
  4. // code.........   
  5.   
  6. m.requestDone();   

阅读(1311) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册