也来玩玩MongoDB

最近NoSQL(或者NoRelation)很火,咱不想Out了,所以也来凑凑热闹。

概念、优点之类的东西就不在这里重复啰嗦了,
直接动手玩一下。

MongoDB(包括Java驱动)的官方文档写得不够认真,
连个最普通的CRUD例子都没有,
看过网站上那篇“Java - Saving Objects Using DBObject”文章的人肯定被气晕了。。。

安装:
1)下载MongoDB数据库(这里使用Windows 32 bit版)

http://downloads.mongodb.org/win32/mongodb-win32-i386-1.2.4.zip

然后解压到一个目录(这里是D:MongoDB),
并且在D:MongoDB目录中建个”datadb”目录用来存放数据文件。
(注意:很多文档中说”C:datadb”目录是缺省目录,实际上是不起作用的)

2)下载MongoDB数据库的Java驱动程序

http://github.com/downloads/mongodb/mongo-java-driver/mongo-1.3.jar
然后把mongo-1.3.jar放到D:MongoDB目录

完成上面两步就算完成安装任务了,够简单吧。

启动MongoDB数据库服务器:

D:>cd D:MongoDB
D:MongoDB>binmongod –dbpath datadb
能看到下面这张图就算是成功了:

下面是一个CRUD例子,虽然简单,不过也算是覆盖了大多数核心内容了,
一边看代码一边看注释吧,挺简单的。

Java代码

  1. import java.util.*;
  2. import com.mongodb.*; //com.mongodb包类似于java.sql,大多数与数据库相关的类都在这里
    3.4. public class MongoTest {
  3. public static void out(Object o) {
  4. System.err.println(o);
  5. }
  6. public static void out() {
  7. System.err.println();
  8. }
    11.12. public static void main(String[] args) throws Exception {
  9. //Mongo是与java.sql.Connection同等级别的概念,
  10. //默认是链接到127.0.0.1:27017/test,
  11. //见getConnectPoint()的输出结果,其中27017是端口号,test是数据库名
  12. Mongo mongo = new Mongo();
  13. out(“mongo.getConnectPoint() = “+mongo.getConnectPoint());
    18.19. //查看所有的数据库名
  14. for(String dbName : mongo.getDatabaseNames()) {
  15. out(“dbName = “+dbName);
  16. }
    23.24. //DB类用来表示一个数据库,如果数据库不存在则创建一个
  17. DB db = mongo.getDB( “test” );
    26.27. //查看所有的Collection名
  18. for(String collectionName : db.getCollectionNames()) {
  19. out(“collectionName = “+collectionName);
  20. }
    31.32. out();
    33.34. //DBCollection类用来存放对象,类似数据库表的概念
  21. DBCollection coll = db.getCollection(“testCollection”);
    36.37. //插入10个User对象到coll
  22. //插入DBCollection中的对象必需实现DBObject接口(见User类的注释)
  23. for(int i=1; i<=10; i++) {
  24. User user = new User();
  25. user.setName(“user “+(10+i));
  26. user.setAge(10+i);
  27. user.setDate(new Date());
    44.45. coll.insert(user);
  28. }
    47.48. findAll(coll); //查找出coll中的所有对象并打印输出
    49.50. //查找出第一条记录,在内部会自动转换成User类型
  29. coll.setObjectClass(User.class);
  30. User user = (User)coll.findOne();
  31. out(“user.name=”+user.getName());
  32. out(“user.age=”+user.getAge());
  33. out(“user.getDate()=”+user.getDate());
  34. coll.setObjectClass(BasicDBObject.class); //还原最初的对象类型
    57.58. out();
    59.60. user.setAge(100);
  35. coll.save(user); //保存更新
  36. findAll(coll); //确认第一条记录的”Age”是否变成100了?
    63.64. coll.remove(user); //删除第一条记录
    65.66. findAll(coll);
    67.68. //查找年纪大于等于15小于等于18的记录(15<=age<=18)
  37. //(查询条件的组合方式很啰嗦,这方面就没sql方便)
  38. BasicDBObject query = new BasicDBObject();
  39. //注意这里的”Age”第一个字母要大写,如果把User类替换成UserNoReflection类就用小写,
  40. //这是因为ReflectionDBObject类的内部实现在截取setter和getter方法的”set”和”get”前缀后
  41. //没有进行大小写转换,比如”setAge”得到的key值就是”Age”
  42. query.put(“Age”, new BasicDBObject(“$gte”, 15).append(“$lte”, 18));
    75.76.77. DBCursor cur = coll.find(query);
  43. while(cur.hasNext()) {
  44. out(cur.next());
  45. }
    81.82. out();
    83.84. //跳过前面3条记录,然后显示总共5条记录
  46. cur = coll.find().skip(3).limit(5);
  47. while(cur.hasNext()) {
  48. out(cur.next());
  49. }
    89.90. coll.drop(); //删除coll这个DBCollection
  50. }
    92.93. public static void findAll(DBCollection coll) {
  51. DBCursor cur = coll.find();
  52. while(cur.hasNext()) {
  53. out(cur.next());
  54. }
  55. out();
  56. }
    100.101. //插入DBCollection中的java对象必需实现DBObject接口,
  57. //ReflectionDBObject实现了DBObject接口,在内部是采用反射来完成的
  58. public static class User extends ReflectionDBObject {
  59. private String name;
  60. private int age;
  61. private Date date;
    107.108. public void setName(String name) {
  62. this.name = name;
  63. }
    111.112. public String getName() {
  64. return name;
  65. }
    115.116. public void setAge(int age) {
  66. this.age = age;
  67. }
    119.120. public int getAge() {
  68. return age;
  69. }
    123.124. public void setDate(Date date) {
  70. this.date = date;
  71. }
    127.128. public Date getDate() {
  72. return date;
  73. }
  74. }
    132.133. //如果不想用反射的方式,又不想手工实现DBObject接口的方法,
  75. //可以直接继承BasicDBObject,但是需要做额外的工作,
  76. //就像下面这样:
  77. public static class UserNoReflection extends BasicDBObject {
  78. private String name;
  79. private int age;
  80. private Date date;
    140.141. public void setName(String name) {
  81. this.name = name;
    143.144. super.put(“name”, name);
  82. }
    146.147. public String getName() {
  83. return name;
  84. }
    150.151. public void setAge(int age) {
  85. this.age = age;
    153.154. super.put(“age”, age);
  86. }
    156.157. public int getAge() {
  87. return age;
  88. }
    160.161. public void setDate(Date date) {
  89. this.date = date;
    163.164. super.put(“date”, date);
  90. }
    166.167. public Date getDate() {
  91. return date;
  92. }
    170.171. public Object put(String key, Object v) {
  93. if(key.equals(“name”)) name = (String)v;
  94. else if(key.equals(“age”)) age = (Integer)v;
  95. else if(key.equals(“date”)) date = (Date)v;
    175.176. return super.put(key, v);
  96. }
  97. }
  98. }
    把MongoTest.java文件放到D:MongoDB目录

编译:
javac -cp D:MongoDBmongo-1.3.jar D:MongoDBMongoTest.java

运行:
java -cp D:MongoDBmongo-1.3.jar;D:MongoDB MongoTest

Douyu也支持MongoDB了,比上面的代码还简洁

Java代码

  1. //对应上面的User类(或UserNoReflection类),
  2. //在Douyu中如下所示,不需要任何setter和getter代码
    3.4. import douyu.mvc.Model;
    5.6. @Model
  3. public class User {
  4. private String name;
  5. private int age;
  6. private Date date;
  7. }
    然后在conf/server.java中配置一个MongoDB的数据源(跟普通的关系型数据库类似)

最后是Controller

Java代码

  1. import java.util.Date;
  2. import douyu.mvc.Controller;
  3. import douyu.mvc.ModelManager;
    4.5. @Controller
  4. public class MongoTest {
  5. public void index(ModelManager modelManager) {
  6. User user = new User();
  7. //下面三个setter方法虽然没有在User类中声明,
  8. //但是编译器在编译User类时发现User类带有@Model,就会自动生成setter、getter方法
  9. user.setName(“user 10”);
  10. user.setAge(10);
  11. user.setDate(new Date());
    14.15. modelManager.insert(user);
    16.17. user.setAge(20);
  12. modelManager.save(user);
    19.20. modelManager.delete(user);
  13. //….
  14. }
  15. }

本文来源于"阿里中间件团队播客",原文发表时间" 2011-07-06  "

时间: 2024-10-25 17:42:22

也来玩玩MongoDB的相关文章

图解故障服务器下线:关于阿里云MongoDB高可用的探秘

服务器容灾一直是云服务运维过程中无法避开的问题,我们常常会讨论如何对出现故障的机器进行数据库方面的恢复,却很少考虑到在机器出现故障后,是用一套怎样的处理流程将三节点副本集恢复如初的. MongoDB采用的是什么方法,得以做到在有机器故障的情况下依旧能保证用户业务的高可用?最近举行的"MongoDB Sharding杭州用户交流会"中,针对这一问题,阿里云资深研发工程师果实分享了关于MongoDB 故障服务器如何下线方面的详尽的技术解密. 对于MongoDB数据库来说,MongoDB内核

windows下php mongodb 安装配置使用查询

这几天参加了一个创意马拉松大赛,虽然没拿什么奖,重在参与嘛 终于有机会实践mongodb数据库了,以前只是自己配置装着玩玩 作者:风来了.呆狐狸 环境:window10 64 +php5.5.x+mysql5.7.x+mongodb2.6.x mongod安装 1.下载 http://www.mongodb.org/downloads 我这边下载的是64-bit msi 2.安装 默认就可以 默认安装目录 C:\Program Files\MongoDB 2.6 Standard\bin 3.配

请问一下如果学习mongodb等NOSQL数据库还需要学习LINQ或者ADO吗????

问题描述 会C#最近想学习数据库.不过SQL太麻烦了.如果学习NOSQL的数据库还需要学习LINQ或者ADO吗?我搞不清他们之间的关系...+_+万分感谢啊! 解决方案 解决方案二:是否"够用"是个主观的词,没有一定的标准.没有工具可以解决所有问题,也没有问题需要所有工具.具体需要哪些工具,取决于你面对什么问题.解决方案三:mongoDB的话学习比较简单下载数据库然后配置下载C#的驱动再度一度几个小时就学个简简单单的可以玩玩增删改什么的0.0解决方案四:一般的公司用不到NOSQLSQL

python操作mongodb根据

  本文实例讲述了python操作mongodb根据_id查询数据的实现方法.分享给大家供大家参考.具体分析如下: _id是mongodb自动生成的id,其类型为ObjectId,所以如果需要在python中通过_id查询,就需要转换类型 如果pymongo的版本号小于2.2,使用下面的语句导入ObjectId ? 1 from pymongo.objectid import ObjectId 如果pymongo的版本号大于2.2,则使用下面的语句 ? 1 from bson.objectid

MySQL和MongoDB设计实例对比

MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚.下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢? 如果使用MySQL的话,应该如何存取数据呢? 如果使用MySQL话,手机的基本信息单独是一个表,另外由于不同手机的参数信息差异很大,所以还需要一个参数表来单独保存. CREATE TABLE IF NOT EXISTS `mobiles` (     `id` 

MongoDB · 特性分析 · MMAPv1 存储引擎原理

MongoDB 的 mongod 服务管理一个数据目录,可包含多个DB,每个DB的数据单独组织,本文主要介绍 MMAPv1 存储引擎的数据组织方式. Database 每个 Database(DB) 由一个.ns文件及若干个数据文件组成 $ll mydb.* -rw------- 1 ydzhang staff 67108864 7 4 14:05 mydb.0 -rw------- 1 ydzhang staff 16777216 7 4 14:05 mydb.ns 数据文件从0开始编号,依次

Windows下Mongodb安装及配置

参考:http://blog.csdn.net/mzbonnt/article/details/51461331#comments **欢迎加入疯狂源代码学习.QQ群127591054 工作中遇到了,所以学习下.** 这里装的是最新的 安装文件:mongodb-win32-x86_64-2008plus-ssl-3.4.6-signed.msi 电脑配置:win10 64位 mongodb的安装很简单,设置好安装路径后,一直Next直到安装结束. 最大的坑就是MongoDB服务的安装,下面具体说

mongodb WriteConcern

Java代码   http://www.reader8.cn/jiaocheng/20130826/1875289.html   Java代码       (1)不安全的操作 a)ERRORS_IGNORED:只是将消息发出,忽略一切错误,甚至网络错误也不理会. b)UNACKNOWLEDGED:将消息发送给socket即返回,不确保数据写入到数据库,因此发生网络错误时会有提示.默认值. (2)处于弱状态 a)ACKNOWLEDGED:确保已将数据写入到shard中的主节点中,这时如果有针对主节

玩玩小爬虫——试搭小架构

     第一篇我们做了一个简单的页面广度优先来抓取url,很显然缺点有很多,第一:数据结构都是基于内存的,第二:单线程抓取 速度太慢,在实际开发中肯定不会这么做的,起码得要有序列化到硬盘的机制,对于整个爬虫架构来说,构建好爬虫队列相当重要.      先上一幅我自己构思的架构图,不是很完善,算是一个雏形吧. 一:TODO队列和Visited集合      在众多的nosql数据库中,mongodb还是很不错的,这里也就选择它了,做集群,做分片轻而易举. 二:中央处理器      群架,斗殴都是