好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

mongodb高级操作及在Java企业级开发中的应用.

mongodb高级操作及在Java企业级开发中的应用.

Java 连接 mongoDB

Java 连接 MongoDB 需要驱动包 , 个人所用包为 mongo-2.10.0.jar . 可以在网上下载最新版本 .

 package   org.dennisit.mongodb.study;

  import   com.mongodb.BasicDBObject;
  import   com.mongodb.DB;
  import   com.mongodb.DBCollection;
  import   com.mongodb.Mongo;

  /**  
 * 
 *    MongoDBUtil.java
 *
 *     功   能: Java连接MongoDB小Demo(连接并插入一条数据)
 *     类   名: MongoDBUtil
 *
 *  ver      変更日        角色           担当者     変更内容
 *     ──────────────────────────────────────────────
 *  V1.00   2013-1-16   Demo模块    苏若年     初版
 *
 *     Copyright (c) 2013 dennisit corporation All Rights Reserved.
 *   
 *  Email:<a href="mailto:DennisIT@163.com">发送邮件</a>
 *
   */ 
 public   class   MongoDBUtil {

      public   static   void   main(String[] args) {
        Mongo mongo  =  null  ;
          try   {
              //  通过连接字符串得到一个数据库实例的连接 
            mongo =  new  Mongo("127.0.0.1",27017 );
        }   catch   (Exception e) {
            e.printStackTrace();
        }
          //  获得一个数据库对象,mydb为数据库民称 
        DB db = mongo.getDB("mydb" );
          //  指定安全授权信息[mydb数据库的用户名为mydbusr,密码为123] 
        db.authenticate("mydbusr", "123" .toCharArray());
        
          //  声明一个collection对象 
        DBCollection collection = db.getCollection("user" );
          //  声明一个document文档对象,用户存储数据 
        BasicDBObject doc =  new   BasicDBObject();
        doc.put( "name", "suruonian" );
        doc.put( "email", "dennisit@163.com" );
        BasicDBObject experience  =  new   BasicDBObject();
        experience.put( "year of 2012", "i work in hangzhou" );
        experience.put( "year of 2013", "i work in shenzhen" );
        doc.put( "work experience" , experience);
          //  调用collection的insert方法,将数据持久化到磁盘上. 
         collection.insert(doc);
        System.out.println( "test data insert finish " );
    }
}

这时登录到mydb.查看
 > db.user.find({},{_id:0 });
{  "name" : "suruonian", "email" : "dennisit@163.com", "work experience" : { "year of 2012" : "i work in hangzhou", "year of 2013" : "i work in shenzhen"  } }
 >

 

mongoDB 查询数据

通过 findOne() 查询一条数据

          //  连接到mongodb
        
          //  获得一个数据库对象,mydb为数据库民称 
        DB db = mongo.getDB("mydb" );
          //  指定安全授权信息[mydb数据库的用户名为mydbusr,密码为123] 
        db.authenticate("mydbusr", "123" .toCharArray());
        
          //  声明一个collection对象 
        DBCollection collection = db.getCollection("user" );
        DBObject userdoc =  collection.findOne();
        System.out.println( "查询到的一条记录为:" +  userdoc);
     

mongoDB 更新数据

将 user 集合中 name 为 suruonian 的 name 值改成 dennisit.

         
          //  连接到mongodb

          //  声明collection对象 
        DBCollection collection = db.getCollection("user" );
        
          //  定义一个查询对象, 
        DBObject updateAim =  new   BasicDBObject();
        updateAim.put( "name", "suruonian" );
        
        System.out.println( "通过用户名查找到的对象为:" +  collection.findOne(updateAim));
        
          //  定义一个更新对象,类似于set语句 
        DBObject updatedValue =  new   BasicDBObject();
        updatedValue.put( "name", "dennisit" );
        
          //  db.user.update({name:"suruonian"},{$set:{name:dennisit}}); 
        DBObject updateSetValue =  new  BasicDBObject("$set" ,updatedValue);
        
          //  将查询对象和更新对象作为参数传给update来完成更新. 
         collection.update(updateAim, updateSetValue);
        
        System.out.println( "更新后查询到的一条记录为:" +  collection.findOne());
     

mongoDB 删除数据

删除操作 user 集合中 name 为 dennisit 的用户

        
          //  连接到mongodb

           //  声明collection对象 
        DBCollection collection = db.getCollection("user" );
        
          //  定义一个查询对象, 
        DBObject aimObj =  new   BasicDBObject();
        aimObj.put( "name", "dennisit" );
        
        System.out.println( "通过用户名查找到的对象为:" +  collection.findOne(aimObj));
        
        collection.remove(aimObj);
        System.out.println( "删除后查询到的一条记录为:" + collection.findOne());

MonggoDB 保证事物的一致性

MongoDB 的 Java 驱动是线程安全的 , 对于一般的应用 , 只要一个 mongo 实例即可 .mongo 有个内置的连接池 ( 连接池默认可容纳 10 个数据库连接 ), 在有大量写和读的环境中 , 为了确保在一个 session 中使用同一个 DB 时 , 可以通过 DB 类的 requestStart() 方法打开失去控制 , 待所有业务代码编写完毕后 , 再通过 DB 类的 requestDone() 方法结束事物控制 . 这样就保证了事物的原子性 .

       
         //  声明collection对象 
        DBCollection collection = db.getCollection("user" );
        
          //  开始事务控制 
         db.requestStart();
        
          //  事务相关操作
        
          //  结束事物控制 
         db.requestDone();
         

MongoDB 库级别操作

获取连接的 IP 地址

mongo.getAddress() ;

 

列出所有数据库 [ 此操作只针对超级用户 ]

mongo.getDatabaseNames() ;

 

删除指定数据库 [ 此操作只针对超级用户 ]

mongo.dropDatabase("testdb");

 

代码演示

     public   static   void   main(String[] args) {
        
        Mongo mongo  =  null  ;
          try   {
              //  通过连接字符串得到一个数据库实例的连接 
            mongo =  new  Mongo("127.0.0.1",27017 );
        }   catch   (Exception e) {
            e.printStackTrace();
        }
          //  连接超级用户 
        DB db = mongo.getDB("admin" );
          //  指定安全授权信息[超级用户的用户名为root,密码为root123] 
        db.authenticate("root", "root123" .toCharArray());
        
          //  getAddress方法获取IP和端口 
        System.out.println("当前连接的IP和端口为:" +  mongo.getAddress());
        
          //  列出所有数据库,此操作只针对超级用户 
        System.out.println("系统中的所有数据库为:" +  mongo.getDatabaseNames());
        
          //  删除数据库,此操作只针对超级用户 
        mongo.dropDatabase("testdb" );
        System.out.println( "系统中的所有数据库为:" +  mongo.getDatabaseNames());

    }
控制台输出信息
当前连接的IP和端口为: 127.0.0.1:27017 
系统中的所有数据库为:[admin, mydb, testdb, local, test]
系统中的所有数据库为:[admin, mydb, local, test] 

MongoDB对用户的操作

为连接的数据库添加用户

        DB db = mongo.getDB("mydb" );
        db.addUser( "username", "password".toCharArray(), true );

 

参数说明

第一个参数为要条件的用户名

第二个参数为要添加的用户对应的访问口令

第三个参数为readOnly,代表用户的权限,为true表示值读权限,为false表示为读/写权限.默认为false.不传参代表默认.

 

删除某个用户

        DB db = mongo.getDB("mydb" );
        db.removeUser( "username");

参数说明

传入的参数为要删除的用户名.要删除的用户必须应是已存在的.

 

MongoDB对集合collection的操作

Collection是MongoDB中存储数据的最小单元.

列出连接数据库下的所有集合

         DB db = mongo.getDB("mydb" );
          //  指定安全授权信息[超级用户的用户名为root,密码为root123] 
        db.authenticate("mydbusr", "123" .toCharArray());
        
          //  列出mydb数据库中的所有collection 
        Set<String> collets =  db.getCollectionNames();
          for  (String str : collets){
            System.out.println(str);
        } 

 

判断某个collection是否存在

         //  判断user集合是否存在,返回值为boolean类型 
        System.out.println(db.collectionExists("user"));

 

新建collection

Java可以通过DB类的createCollection(String name , DBObject option ) 方法新建集合

参数说明

第一个参数表示创建的 collection 的名字

第二个参数决定了是否创建的是 Capped Collection.

         //  创建非CappedCollection对象,false表示不是一个CappedCollection 
        DBObject optial =  new  BasicDBObject().append("capped",  false  );
          //  显示创建非CappedCollection 
        db.createCollection("nocapped" , optial);
        System.out.println(db.getCollection( "nocapped" ).getStats().toString());
        
          //  创建CappedCollection对象,true表示是一个CappedCollection 
        DBObject opt =  new  BasicDBObject().append("capped",  true ).append("max", 5 );
        db.createCollection( "iscapped" , opt);
        
        System.out.println(db.getCollection( "iscapped" ).getStats().toString());
        
          //  使用isCapped()判断是否为CappedCollection 
        System.out.println(db.getCollection("nocapped").isCapped());  //  false 
        System.out.println(db.getCollection("iscapped").isCapped());  //  true 

 

删除collection

通过DBCollection的drop()方法删除集合.

         DBCollection collect = db.getCollection("iscapped" );
        collect.drop();      //  删除iscapped集合 

 

计算document数量

         //  控制台插入测试数据for (i=1; i<=5;i++){ db.user.insert( {name:"user"+i , age: i+4*5 } ); } 
        DBCollection collectuser = db.getCollection("user" );
        System.out.println( "集合" + collectuser + "下共有" + collectuser.getCount() + "条记录" );
        
        BasicDBObject  obj  =  new   BasicDBObject();
        BasicDBObject gtTag  =  new   BasicDBObject();
        gtTag.put( "$gt", 23 );
          //  db.user.find({age:{$gt:23}}); 
        obj.put("age" , gtTag);
        System.out.println( "集合" + collectuser + "下年龄大于25的共有" + collectuser.getCount(obj) + "条记录" );

控制台输出
集合user下共有5条记录
集合user下年龄大于25的共有2条记录 

 

通过游标获取所有document

Java可以通过游标DBCursor的方式来获取每一条document.

        DBCollection collection = db.getCollection("user" );
          //  用游标获取所有数据 
        DBCursor cur =  collection.find();    
          while  (cur.hasNext()){
            System.out.println(cur.next());
        }
也可以查询部分,如部分显示:DBCursor cur  = collection.find().limit(3);    

 

对索引的操做

 

创建索引

Java可以通过DBCollection类的createIndex(DBObject keys)方法创建索引,它接收一个DBObject类型的参数“keys”用于表明在哪些列上创建索引.

        DBCollection collection = db.getCollection("user" );
          //  在user集合的name列上创建索引 
        collection.createIndex( new  BasicDBObject("name",1 ));
可以通过db.user.getIndexes();查看索引信息 

 

获取索引

DBCollection类的getIndexInfo();

        DBCollection collection = db.getCollection("user" );
          //  获取集合中的所有索引信息 
        List<DBObject> list =  collection.getIndexInfo();
          for  (DBObject var : list){
            System.out.println(var);
        }
类似于 db.user.getIndexes(); 

 

删除索引

DBCollection的dropIndexes()删除当前集合中的所有索引.

        DBCollection collection = db.getCollection("user" );
        
          //  删除集合中的指定索引信息,删除name索引,1表示删除为真 
        collection.dropIndex( new  BasicDBObject("name",1 ));
        
          //  删除该集合中所有索引[_id索引不支持删除] 
         collection.dropIndexes();
可以通过db.user.getIndexKeys();查看user集合中的索引 

 

Java对MongoDB的高级查询

 

使用QueryBuilder查询构造器对MongoDB进行高级查询

 SQL语句:
         select  * from user where username =  ‘user3’;
MongoDB:
         db.user.find( { name: "user3" } );
Java代码:
        DBCollection collection  = db.getCollection("user" );
          //  查询用户名为user3的用户 
        DBObject query =  new  QueryBuilder().put("name").is("user3" ).get();
        DBCursor cur  =  collection.find(query);
          while  (cur.hasNext()){
            System.out.println(cur.next());
        }
输出结果:
          {  "_id" : { "$oid" : "50f6d250778eafb6ef5bcee7"} , "name" : "user3" , "age" : 23.0}

 

notEquals不等于

查询user集合中用户名name值不等于user3的用户

 SQL语句:
         select  * from user where username !=  ‘user3’;
MongoDB:
         db.user.find( { name:{$ne: "user3" } } );
Java代码:
        DBCollection collection  = db.getCollection("user" );
          //  查询用户名不为user3的用户 
        DBObject query =  new  QueryBuilder().put("name").notEquals("user3" ).get();
        DBCursor cur  =  collection.find(query);
          while  (cur.hasNext()){
            System.out.println(cur.next());
        }
输出结果:
          {  "_id" : { "$oid" : "50f6d250778eafb6ef5bcee5"} , "name" : "user1" , "age" : 21.0 }
          {  "_id" : { "$oid" : "50f6d250778eafb6ef5bcee6"} , "name" : "user2" , "age" : 22.0 }
          {  "_id" : { "$oid" : "50f6d250778eafb6ef5bcee8"} , "name" : "user4" , "age" : 24.0 }
          {  "_id" : { "$oid" : "50f6d250778eafb6ef5bcee9"} , "name" : "user5" , "age" : 25.0}

 

greaterThan大于

查询user集合中age大于22的用户

 SQL语句:
         select  * from user where age > 22 ;
MongoDB:
         db.user.find( { age:{$gt: 22 } } );
QueryBuilder构造:
        DBObject query  =  new  QueryBuilder().put("age").greaterThan(22).get();

 

 

greaterThanEquals大于等于

查询user集合中age大于等于22的用户

 SQL语句:
         select  * from user where age >= 22 ;
MongoDB:
         db.user.find( { age:{$gte: 22 } } );
QueryBuilder构造:
        DBObject query  =  new  QueryBuilder().put("age").greaterThanEquals(22).get();

 

lessThan小于

查询user集合中age小于22的用户

 SQL语句:
         select  * from user where age < 22 ;
MongoDB:
         db.user.find( { age:{$lt: 22 } } );
QueryBuilder构造:
        DBObject query  =  new  QueryBuilder().put("age").lessThan(22).get();

 

lessThanEquals小于等于

查询user集合中age小于等于22的用户

 SQL语句:
         select  * from user where age <= 22 ;
MongoDB:
         db.user.find( { age:{$lte: 22 } } );
QueryBuilder构造:
        DBObject query  =  new  QueryBuilder().put("age").lessThanEquals(22).get();

 

 

In范围内

查询user集合中age在23或24的记录

 SQL语句:
         select  * from user where age in (23,24 );
MongoDB:
         db.user.find( { age:{$in:[ 23,24 ]} } );
Java代码:
        DBCollection collection  = db.getCollection("user" );
          //  查询user集合中age为23或者24的用户 
         int [] inList = {23,24 };
        DBObject query  =  new  QueryBuilder().put("age" ).in(inList).get();
        DBCursor cur  =  collection.find(query);
          while  (cur.hasNext()){
            System.out.println(cur.next());
        } 

 

 

notIn范围外

查询user集合中age不是23或24的记录

 SQL语句:
         select  * from user where age not in (23,24 );
MongoDB:
         db.user.find( { age:{$nin:[ 23,24 ]} } );
Java代码:
        DBCollection collection  = db.getCollection("user" );
          //  查询user集合中age为23或者24的用户 
         int [] inList = {23,24 };
        DBObject query  =  new  QueryBuilder().put("age" ).notIn(inList).get();
        DBCursor cur  =  collection.find(query);
         

 

and逻辑与

查询user集合中age大于22并且性别为”man“的用户

 SQL语句:
         select  * from user where sex = ‘man’ and age > 20 ;
MongoDB:
         db.user.find({sex: "man",age:{$gt:20 }});
Java代码:
          //  查询user集合中age大于22并且性别为”man“的用户 
        DBObject query =  new  QueryBuilder().put("sex").is("man").and("age").greaterThan(20).get();

正则表达式

查询name以user开头的记录

 SQL语句:
         select  * from user where name like ‘user% ’;
MongoDB:
         db.user.find({name: /^user.*/ });
Java代码:
        DBCollection collection  = db.getCollection("user" );
        Pattern pattern  = Pattern.compile("^user" );
        BasicDBObject query  =  new  BasicDBObject("name",pattern);

 

分页查询

mongoDB中通过skip()和limit()结合实现分页

     public   static   void   main(String[] args) {
        
        Mongo mongo  =  null  ;
          try   {
              //  通过连接字符串得到一个数据库实例的连接 
            mongo =  new  Mongo("127.0.0.1",27017 );
        }   catch   (Exception e) {
            e.printStackTrace();
        }
          //  连接超级用户 
        DB db = mongo.getDB("mydb" );
          //  指定安全授权信息[超级用户的用户名为root,密码为root123] 
        db.authenticate("mydbusr", "123" .toCharArray());
        
          int   perNum = 10;         //  每页显示的数目 
         int   count = 0;             //  数据库中总共记录数目 
         int   pageNum = 0;         //  分页后的页数 
         
        DBCollection collection  = db.getCollection("user" );
        
        count  = ( int )collection.getCount();         //  总共记录数 
        pageNum = (count-1)/perNum + 1;             //  计算总共页数 
         
        System.out.println( "数据库"+collection+"中共有"+count+"条记录,每页显示"+perNum+"条记录,可显示"+pageNum+"页" );
        
          //  循环分页打印 
         for ( int  i=0; i<pageNum; i++ ){
            System.out.println( "------------第" + (i+1) + "页数据------------" );
            DBCursor cur  = collection.find().skip(i* perNum).limit(perNum);
              while  (cur.hasNext()){
                System.out.println(cur.next());
            }
        }
    } 

 

 

Java操作GridFS

 

插入数据

使用GridFS类的createFile(File file)方法可以将大文件保存到MongoDB中,该方法接收一个参数,表示本地文件路径

 public   static   void   main(String[] args) {
        Mongo mongo  =  null  ;
          try   {
            mongo  =  new  Mongo("127.0.0.1",27017 );
        }   catch   (Exception e) {
              //   TODO: handle exception 
         }
        DB db  = mongo.getDB("mydb" );
        db.authenticate( "mydbusr", "123" .toCharArray());
        

        File zipFile  =  new  File("D:/freemarker源码.rar");     //  创建文件对象
          //  将文件存放到file数据库中 
        GridFS gfs =  new  GridFS(db,"file" );    
        
          //  创建大文件对象输入流 
        GridFSInputFile gfsFile =  null  ;    
          try   {
              //  将本地文件存储到mongo中 
            gfsFile =  gfs.createFile(zipFile);
        }   catch   (Exception e) {
            e.printStackTrace();
        }
          //  设置存储的文件名 
        gfsFile.setFilename("demozip" );
        gfsFile.save();
    }
在mydb数据库下查看存储的文件信息
 >  db
mydb
 >  show collections;
file.chunks
file.files
system.indexes
system.users
user
 >  db.file.files.findOne();
{
         "_id" : ObjectId("50f780a7de886482c92a56c9" ),
         "chunkSize" : NumberLong(262144 ),
         "length" : NumberLong(83711 ),
         "md5" : "51f235ccf838511eb0f53633dbca22b3" ,
         "filename" : "demozip" ,
         "contentType" :  null  ,
         "uploadDate" : ISODate("2013-01-17T04:40:07.240Z" ),
         "aliases" :  null  
} 

 

查询数据

因为上传了一个 zip 文档 , 为了方便观察 , 使用 GridFS 类的 findOne(DBObject query) 方法 , 按文件名查找数据库中的 GridFS 对象信息 , 该方法结束 1 个参数 , 代表查询条件 .

        DB db = mongo.getDB("mydb" );
        db.authenticate( "mydbusr", "123" .toCharArray());
        
          //  将文件存放到file数据库中 
        GridFS gfs =  new  GridFS(db,"file" );    
        
          //  查询GridFS数据,按照文件名查询 db.file.files.findOne({filename:"demozip"}); 
        GridFSDBFile zipfile = gfs.findOne("demozip" );
        System.out.println(zipfile); 

读取并保存数据

首先用 find 或者 findOne 方法找到 GridFS 对象 , 再用 writeTo 方法将数据写到本地 .

        DB db = mongo.getDB("mydb" );
        db.authenticate( "mydbusr", "123" .toCharArray());
        
        GridFS gfs  =  new  GridFS(db,"file" );    
        
          //  查询GridFS数据,按照文件名查询 db.file.files.find({filename:"demozip"}); 
        GridFSDBFile zipfile = gfs.findOne("demozip" );
        System.out.println( "服务器端文件MD5值为:" +  zipfile.getMD5());
          try   {
              //  将读取到的文件写到本地 
            zipfile.writeTo("E:/downgidfs.zip" );
        }   catch   (Exception e) {
              //   TODO: handle exception 
             e.printStackTrace();
        }
控制台输出:服务器端文件MD5值为:51f235ccf838511eb0f53633dbca22b3
验证下载到的文件的MD5
E:\ > md5sum downgidfs.zip
51f235ccf838511eb0f53633dbca22b3  *downgidfs.zip

 

删除数据

Java 中使用 remove(DBObject query) 来实现移除数据

        GridFS gfs =  new  GridFS(db,"file" );        
          //  查询GridFS数据,按照文件名查询 db.file.files.find({filename:"demozip"}); 
        GridFSDBFile zipfile = gfs.findOne("demozip" );
          //  删除查询到的GridFS数据 
        gfs.remove(zipfile);

转载请注明出处:[ http://www.cnblogs.com/dennisit/archive/2013/01/29/2881006.html ]

  

分享到: QQ空间 新浪微博 腾讯微博 人人网 更多

 

热爱生活,热爱Coding,敢于挑战,用于探索 ...

 

 

标签:  MongoDB ,  java开发 ,  高级操作

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于mongodb高级操作及在Java企业级开发中的应用.的详细内容...

  阅读:37次