MongoDB简介与Java连接MongoDB
一、MongoDB是一个跨品台的,面向文档的数据库,属于NoSQL数据库的一种,结余关系型与非关系型数据库的一种,它支持的数据结构非常松散,类似于Json于Bson格式(二进制的Json格式)。MongoDB 的官方网站地址是:http://www.mongodb.org/
二、MongoDB特点
- 面向集合存储,易于存储对象类型的数据。(如果是关系型数据库,存在着ORM -- 对象关系映射的持久层框架,解决 面向对象语言与关系型数据库之间的转换问题,而MongoDB本身就是以面向对象方式存储,就不需要用ORM框架,省略了这一步)。
- 模式自由,指它的数据库结构可以动态扩充,也就是现存先建立结构,不需要先将字段的类型建立,只能够存储这种类型的数据。
- 支持动态查询
- 支持完全索引,包含内部对象
- 使用高效的二进制数据存储包括大型对象(比如音乐、视频)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持多种语言的驱动程序
- 文件存储格式为BSON,一种JSON的扩展
- 支持复制与故障恢复
什么时候使用MongoDB?
在对数据量比较大,频繁写入,数据价值不大的情况使用MongoDB。
MongoDB比关系型数据库写入/读取的速度快,因为MongoDB不支持事务。
MongoDB比较Redis,Redis是属于内存数据库,存储在内存中的,而MongoDB存储的数据量大,数据价值不高,数据存储到磁盘中。
三、MongoDB体系结构
逻辑层次结构为:
数据库(database)---集合(collection)---文档(document集合中一条记录)
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
待续。。。