欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

MongoDB

程序员文章站 2024-01-22 21:56:46
...

一、什么是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

下表是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. 插入与查询文档

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

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

相关标签: mongodb

上一篇: 哪位帮改下正则的问题?

下一篇: