MongoDB
MongoDB
一、什么是MongoDB?
MongoDB是一个跨平台的,面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。
它介于关系型数据库和非关系型数据库之间,是非关系型数据库当中功能最丰富,最向关系型数据库的产品。
MongoDB支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。
二、MongoDB特点
MongoDB最大的特点就是其支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
是一个面向集合的、模式*的文档型数据库。
具体特点总结如下:
- 面向集合存储,易于存储对象类型的数据
- 模式*
- 支持动态查询
- 支持完全索引,包含内部对象
- 支持复制和故障恢复
- 使用高效的二进制数据存储,包括大型对象(如视频等)
- 自动处理碎片,以支持云计算层次的扩展性
- 支持 Python、PHP、Ruby、Java、C、C#、JavaScript、Perl及C++语言的驱动程序,社区中也提供了对Erlang 及 .NET 等平台的驱动程序
- 文件存储格式为BSON(一种JSON的扩展)
三、MongoDB体系结构
MongoDB的逻辑结构是一种层次结构。
主要由:文档(Ducument)、集合(Collection)、数据库(Database)这三部分组成。
逻辑结构主要数面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。
- MongoDB的文档(Document),相当于关系型数据库中的一行记录(Row)。
- 多个文档组成一个集合(Collection),相当于关系型数据库中的表(Table)
- 多个集合,逻辑上组织在一起,就是数据库(Database)
- 一个MOngoDB实例支持多个数据库(Database)
文档(Document)、集合(Collection)、数据库(Database)的层次结构如下图:
下表是MongoDB与MySQL数据库逻辑结构概念的对比
MongoDB | MySQL |
---|---|
数据库(Database) | 数据库(Database) |
集合(Collection) | 表(Table) |
文档(Document) | 行(Row) |
四、MongoDB数据类型
-
null: 用于表示空值或者不存在的字段,{“x” : null}
-
布尔型: true和false,{“x” : true}
-
数值:
shell默认使用64位浮点型数值。{“x” : 3.14} 或{“x”: 3}。
对于整数值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数) {“x”: NumberInt(“3”)},{“x”: NumberLong(“3”)}
-
字符串 :UTF-8字符串都可以表示为字符串类型的数据,{“x”: “呵呵”}
-
**日期:**日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”: new Date()}
-
**正则表达式:**查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/}
-
**数组:**数据列表或数据集可以表示为数组,{“x”: [“a”,“b”,“c”]}
-
**内嵌文档:**文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”: {“y”: 3}}
-
**对象Id:**对象Id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId()}
-
**二进制数据:**二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非UTF-8字符保存到数据库中,二进制数据是唯一的方式。
-
**代码:**查询和文档中可以包括任何JavaScript代码,{“x”: function(){/…/}}
五、常用命令
1. 选择和创建数据库
-- use 数据库名称 -- 如果数据库不存在则自动创建
use spit;
2. 插入与查询文档
- 插入文档
-- db.集合名称.insert(数据);
db.spit.insert({content: "听说十次方恨给力呀", userId: "1011", nickname: "小雅", visits: NumberInt(902)});
- 查询文档
-- db.集合名称.find({条件});
db.spit.find(); -- 查询spit集合中的所有文档
db.spit.find({userId: "1011"}); -- 查询spit集合中 userId 为 1011 的文档
db.spit.findOne({userId: "1011"}); -- 查询满足条件的第一条数据
db.spit.find({userId: "1011"}).limit(3); -- 返回指定条数的满足条件的记录
3. 修改与删除文档
- 修改文档
-- db.集合名称.update({条件}, {修改后的数据})
-- db.集合名称.update({条件}, {$set: {字段: 值})
db.spit.update({_id: "1011"}, {visits: NumberInt(1000)}); -- 修改 _id 为 1011 的记录,浏览量为1000 其他字段都会消失
db.spit.update({_id: "1011"}, {$set:{visits: NumberInt(2000)}}); -- $set 来修改某一个字段的值
- 删除文档
-- db.集合名称.remove(条件);
db.spit.remove({}); -- 删除spit集合中的所有数据 谨慎使用
db.spit.remove({_id: "1011"}); -- 删除spit集合中_id 为1011的记录
4. 统计条数
-- db.spit.count({条件});
db.spit.count(); -- 查询spit集合中的所有记录条数
db.spit.count({userId: "1011"}); -- 查询spit集合中的userId为1011的记录条数
5. 模糊查询
-- db.数据库名称.find({模糊查询条件});
-- /模糊查询字符串/
db.spit.find({content:/流量/}); -- 查询spit集合中 内容包含”流量“的所有记录
db.spit.find({content:/^加班/}); -- 查询spit集合中 内容以”加班“开头的所有记录
db.spit.find({content:/加班$/}); -- 查询spit集合中 内容以”加班“结尾的所有记录
6. 大于 小于 不等于
<, <=, >, >= 这个操作符也是很常用的,格式如下:
db.集合名称.find({ "field" : { $gt: value }}) -- 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) -- 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) -- 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) -- 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) -- 不等于: field != value
--
db.spit.find({"visits":{ $gt: 1000}}); -- 查询visits大于1000的所有记录
7. 包含与不包含
包含使用
$in
操作符
db.数据库名称.find({"field" : { $in : [value1, value2....]}});
--
db.spit.find({userId: {$in: ["1011","1012"]}}); -- 查询spit集合中userId字段包含1011和1012的文档
不包含使用
$nin
操作符
db.数据库名称.find({"field" : { $nin : [value1, value2....]}});
--
db.spit.find({userId: {$nin: ["1011","1012"]}}); -- 查询spit集合中userId字段不包含1011和1012的文档
8. 条件连接
我们如果需要查询同时满足两个以上条件的记录时,需要使用
$and
操作符将天剑进行关联(相当于SQL的and)
db.数据库名称.find({$and: [{条件1}, {条件2},..., {条件n}]});
--
db.spit.find({$and:[ {visits:{$gte:1000}} ,{visits:{$lt:2000} }]}); -- 查询spit集合中visits大于等于1000 并且小于2000的文档
如果两个以上条件之间是或者的关系,我们使用
$or
操作符进行关联,与前面 and的使用方式相同
db.数据库名称.find({$or: [{条件1}, {条件2},..., {条件n}]});
--
db.spit.find({$or:[ {userid:"1013"} ,{visits:{$lt:2000} }]}); -- 查询spit集合中userid为1013,或者浏览量小于2000的文档记录
9. 列值增长
如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用
$inc
运算来实现
db.spit.update({_id:"2"},{$inc: {visits: NumberInt(1)}}); -- _id为2的文档的 visits 字段的值加 1
六、Java操作MongoDB
1. mongodb-driver
mongodb-driver是mongo官方推出的java连接mongoDB的驱动包,相当于JDBC驱动。我们通过一个入门的案例来了解mongodb-driver的基本使用
- 创建工程,引入依赖
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb‐driver</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
2. 创建测试类
-
查询全部记录
/** * MongoDb入门小demo */ public class MongoDemo { public static void main(String[] args) { MongoClient client=new MongoClient("192.168.184.134");//创建连接 MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库 MongoCollection<Document> spit = spitdb.getCollection("spit");// 获取集合 FindIterable<Document> documents = spit.find();//查询记录获取文档集 合 for(Document document:documents){ // System.out.println("内容:"+ document.getString("content")); System.out.println("用户ID:"+document.getString("userid")); System.out.println("浏览量:"+document.getInteger("visits")); } client.close();//关闭连接 } }
-
条件查询
BasicDBObject
对象:表示一个具体的记录,BasicDBObject实现了DBObject,是key-
value的数据结构,用起来和HashMap是基本一致的。查询userid为1013的记录
public class MongoDemo1 { public static void main(String[] args) { MongoClient client=new MongoClient("192.168.184.134");//创建连接 MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库 MongoCollection<Document> spit = spitdb.getCollection("spit");// 获取集合 BasicDBObject bson=new BasicDBObject("userid","1013");// 构建查询 条件 FindIterable<Document> documents = spit.find(bson);//查询记录获取结 果集合 for(Document document:documents){ // System.out.println("内容:"+ document.getString("content")); System.out.println("用户ID:"+document.getString("userid")); System.out.println("浏览量:"+document.getInteger("visits")); } client.close();//关闭连接 } }
查询浏览量大于1000的记录
public class MongoDemo2 { public static void main(String[] args) { MongoClient client=new MongoClient("192.168.184.134");//创建连接 MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库 MongoCollection<Document> spit = spitdb.getCollection("spit");//获取集合 // 构建查询条件 BasicDBObject bson=new BasicDBObject("visits",new BasicDBObject("$gt",1000) ); FindIterable<Document> documents = spit.find(bson);//查询记录获取结果集合 for(Document document:documents){ // System.out.println("内容:"+ document.getString("content")); System.out.println("用户ID:"+document.getString("userid")); System.out.println("浏览量:"+document.getInteger("visits")); } client.close();//关闭连接 } }
-
插入数据
public class MongoDemo3 { public static void main(String[] args) { MongoClient client=new MongoClient("192.168.184.134");//创建连接 MongoDatabase spitdb = client.getDatabase("spitdb");//打开数据库 MongoCollection<Document> spit = spitdb.getCollection("spit");// 获取集合 Map<String,Object> map=new HashMap(); map.put("content","我要吐槽"); map.put("userid","9999"); map.put("visits",123); map.put("publishtime",new Date()); Document document=new Document(map); spit.insertOne(document);//插入数据 client.close(); } }
集合
Map<String,Object> map=new HashMap();
map.put(“content”,“我要吐槽”);
map.put(“userid”,“9999”);
map.put(“visits”,123);
map.put(“publishtime”,new Date());
Document document=new Document(map);
spit.insertOne(document);//插入数据
client.close();
}
}
上一篇: 哪位帮改下正则的问题?