MongoDB简介与Java连接MongoDB

一、MongoDB是一个跨品台的,面向文档的数据库,属于NoSQL数据库的一种,结余关系型与非关系型数据库的一种,它支持的数据结构非常松散,类似于Json于Bson格式(二进制的Json格式)。MongoDB 的官方网站地址是:http://www.mongodb.org/

二、MongoDB特点

  1. 面向集合存储,易于存储对象类型的数据。(如果是关系型数据库,存在着ORM -- 对象关系映射的持久层框架,解决 面向对象语言与关系型数据库之间的转换问题,而MongoDB本身就是以面向对象方式存储,就不需要用ORM框架,省略了这一步)。
  2. 模式自由,指它的数据库结构可以动态扩充,也就是现存先建立结构,不需要先将字段的类型建立,只能够存储这种类型的数据。
  3. 支持动态查询
  4. 支持完全索引,包含内部对象
  5. 使用高效的二进制数据存储包括大型对象(比如音乐、视频)
  6. 自动处理碎片,以支持云计算层次的扩展性
  7. 支持多种语言的驱动程序
  8. 文件存储格式为BSON,一种JSON的扩展
  9. 支持复制与故障恢复

什么时候使用MongoDB?

在对数据量比较大,频繁写入,数据价值不大的情况使用MongoDB。

MongoDB比关系型数据库写入/读取的速度快,因为MongoDB不支持事务。

MongoDB比较Redis,Redis是属于内存数据库,存储在内存中的,而MongoDB存储的数据量大,数据价值不高,数据存储到磁盘中。

三、MongoDB体系结构

逻辑层次结构为:

数据库(database)---集合(collection)---文档(document集合中一条记录)

MongoDB简介与Java连接MongoDB
MongoDB逻辑结构图

MongoDB与MySQL的逻辑结构对比

MongoDb

关系型数据库Mysql

数据库(databases)

数据库(databases)

集合(collections)

表(table)

文档(document)

行(row)

四、MongoDB安装与启动

1、双击安装mongodb-win32-x86_64-2008plus-ssl-3.2.10-signed.msi,启动的服务程序,MongoDB\Server\3.2\bin目录下的mongod.exe,为了方便启动,将MongoDB\Server\3.2\bin 设置到环境变量path中。

2、启动服务,先在cmd中建立一个存放MongoDB数据的文件夹,进入指定的目录创建文件夹,E:\Program_Files\MongoDB>md data\db ;

E:\>mongod --dbpath=e:\Program_Files\MongoDB\data\db

后可以看到MongoDB默认的端口号为:27017

dbpath参数用于指定数据存储目录

可以通过 --port命令修改端口

mongod --port 新端口号 --dbpath=e:\Program_Files\MongoDB\data\db

3、登录系统

当前的命令提示窗口不要关闭,打开一个新的命令提示窗口,输入mongo登入系统,默认连接的是test数据库

如果需要连接远程的MongoDB数据库,则使用命令 mongod 远程IP地址

如果远程的端口不是默认端口,则使用命令 mongod 远程IP地址:端口号 

五、简单查询

1、增删改查

选则或者创建数据库,如果数据库不存在则自动创建

    use 数据库名

插入文档,文档相当于关系型数据库中的记录,先定义一个文档变量,格式为   变量名称={};

    o={name:"沙和尚",sex:"男",age:25,address:"流沙河路11号"};

然后将变量存入MongoDB中,格式为  db.集合名称.save(变量名称);  这里的集合相当于关系型数据库中的表,如果集合不存在,则自动创建。

    db.stu.save(o);

也可以不定义变量,直接存储

    db.student.save({name:'猪八戒',sex:'男',age:59,address:'高老庄度假村'});

2、查询集合,使用  find()方法,查询某个集合的所有文档

    db.student.find();

可以看到每条记录前面有  _id  的字段,相当于关系型数据库中的主键,在插入文档时,没有指定,则MongoDB会自动创建,类型为ObjectID类型,如果在插入文档时,有指定  _id  ,可以使用MongoDB的任意类型。

查询性别为女的记录?

    db.student.find({sex:'女'});

为了避免游标带来的开销,使用MongoDB的findOne();方法查询集合中第一条数据

 db.student.findOne({sex:'男'});
{
        "_id" : ObjectId("5e19aa68f827bea169c9b4c7"),
        "name" : "孙悟空",
        "sex" : "男",
        "age" : 60,
        "address" : "花果山水帘洞"
}

查询集合中前三条数据

     db.student.find({sex:'男'}).limit(3);

3、修改文档,使用  update()  方法加上修改器  $set() 进行修改

修改姓名为孙悟空的年龄为30岁

    db.student.update(  {name:'孙悟空'}  ,  { $set : {age:30} }  );  //注意圆括号,与大尖角括号

4、删除文档,使用  remove()  方法,格式为  db.student.remove( 条件 );

    db.student.remove();  //删除全部

    db.student.remove( {name:'悟空'} );  //删除姓名为悟空的记录

六、高级查询

1、模糊查询,MongoDB的模糊查询是通过正则表达式方式实现的,格式:/模糊查询字符串/

查询student集合中,address包含洞的所有文档

    db.student.find( { address:/洞/} );

查询name字段以  白 开头的所有文档

    db.student.find( { name:/^白/} );

2、NULL值处理

如果需要在集合中查询某个字段的值为null,则可以直接将条件写为 null ,即可查询到数据。

    db.student.find( { address:null} );  //注意:这种查询会找出address字段的值为null,与 不存在address字段的所有记录。

3、大于/小于/不等于

格式:

db.collection.find( { field : { $gt : value } } );  //大于

    db.student.find( { age:{ $gt:55  }  } );

db.collection.find( { field : { $lt : value } } );  //小于

    db.student.find( { age:{ $lt:30  }  }  );

db.collection.find( { field : { $gte : value } } );  //大于等于

    db.student.find( { age:{ $gte:30  }  }  );

db.collection.find( { field : { $lte : value } } );  //小于等于

    db.student.find( { age:{ $lte:25  }  }  );

db.collection.find( { field : { $ne :value } } );  //不等于

    db.student.find({ sex:{$ne:'男'} });

4、判断字段是否存在,包含、不包含

格式:

db.collection.find( { name:{ $exists : true }  }  );   //在集合中存在name字段的所有记录

db.collection.find( { age:{ $in:[12,55]  } } );  //在集合中age字段包含12,55的记录

db.collection.find( age:{ $nin:[ 33,22 ] } );  //在集合中age字段不包含33,22的记录

5、统计记录条数、条件连接并且、条件连接或者

查询student集合中age小于等于25的记录数量

    db.student.count( { age:{ $lte:25 } } );    

查询student集合中,年龄大于等于22并且小于等于50 的记录

    db.student.find( { $and:[ { age:{ $gte:22 } },{ age:{ $lte:50 } } ] } );

查询student集合中,年龄大于等于22或者小于等于50 的记录

    db.student.find( { $or:[ { age:{ $gte:22 } },{ age:{ $lte:50 } } ] } );

 

七、Java连接MongoDB

待续。。。