MongoDB

一、什么是MongoDB?

MongoDB是一个跨平台的,面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。

它介于关系型数据库和非关系型数据库之间,是非关系型数据库当中功能最丰富,最向关系型数据库的产品。

MongoDB支持的数据结构非常松散,是类似JSON的BSON格式,因此可以存储比较复杂的数据类型。

MongoDB官方网址

二、MongoDB特点

MongoDB最大的特点就是其支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系型数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

是一个面向集合的、模式自由的文档型数据库。

具体特点总结如下:

  • 面向集合存储,易于存储对象类型的数据
  • 模式自由
  • 支持动态查询
  • 支持完全索引,包含内部对象
  • 支持复制和故障恢复
  • 使用高效的二进制数据存储,包括大型对象(如视频等)
  • 自动处理碎片,以支持云计算层次的扩展性
  • 支持 Python、PHP、Ruby、Java、C、C#、JavaScript、Perl及C++语言的驱动程序,社区中也提供了对Erlang 及 .NET 等平台的驱动程序
  • 文件存储格式为BSON(一种JSON的扩展)

三、MongoDB体系结构

MongoDB的逻辑结构是一种层次结构。

主要由:文档(Ducument)、集合(Collection)、数据库(Database)这三部分组成。

逻辑结构主要数面向用户的,用户使用MongoDB开发应用程序使用的就是逻辑结构。

  1. MongoDB的文档(Document),相当于关系型数据库中的一行记录(Row)。
  2. 多个文档组成一个集合(Collection),相当于关系型数据库中的表(Table)
  3. 多个集合,逻辑上组织在一起,就是数据库(Database)
  4. 一个MOngoDB实例支持多个数据库(Database)

文档(Document)、集合(Collection)、数据库(Database)的层次结构如下图:
在这里插入图片描述

下表是MongoDB与MySQL数据库逻辑结构概念的对比

MongoDBMySQL
数据库(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. 插入与查询文档

  1. 插入文档
-- db.集合名称.insert(数据);
db.spit.insert({content: "听说十次方恨给力呀", userId: "1011", nickname: "小雅", visits: NumberInt(902)});
  1. 查询文档
-- 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. 修改与删除文档

  1. 修改文档
-- 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 来修改某一个字段的值
  1. 删除文档
-- 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的基本使用

  1. 创建工程,引入依赖
<dependencies>
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb‐driver</artifactId>
        <version>3.6.3</version>
    </dependency>
</dependencies>

2. 创建测试类

  1. 查询全部记录

    /**
     * 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();//关闭连接
        }
    }
    

  2. 条件查询

    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();//关闭连接
        }
    }
    

  3. 插入数据

    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();
        }
    }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值