• 快速了解 MongoDB


    数据库结构

    一个mongo数据库下可以包含多个子库(和mysql一样),一个子库下可以包含多个集合,每个集合下可以存储多个文档。文档要求必须是json格式的文本内容,一个文档中只能有一个json,所以文档算是数据库的最小的一个数据单元,可以算做是一条数据。在集合中可以添加索引以加快对文档的查询。同样,因其基于json文档的存储特性,而并非表格,所以mongo数据库也被归类于非关系型数据库。

    每个文档都必须有一个唯一的id字段,若写入新文档时并未制定,则自动在json的第一级中生成_id字段作为文档的主键id。

    mongo数据库有着类似缓存数据库的特点,不需提前去专门去建立数据库和集合,当你把集合写入一个数据库时,若数据库不存在,会自动建立。同样当写入文档时,若集合不存在,也会自动建立。其中每个文档中也可以加入过期时间,以实现自动清理历史数据库的功能,所以凭借着其优异的性能,mongo有时也被直接拿来做缓存数据库使用。

    安装数据库:略,网上有很多类似教程了。

    linux服务器中连接数据库命令(无密码):./mongo host:port
    linux服务器中连接数据库集群命令(无密码):./mongo host1:port1,host2:port2 (多台机器间用逗号连接)
    linux服务器中连接数据库命令(有密码):./mongo host:port/dbName -u username -p 'password'
    linux服务器中连接数据库集群命令(有密码):./mongo host1:port1,host2:port2/dbName -u username -p 'password' (多台机器间用逗号连接)
    注意:这里的./mongo是安装过数据库后,在安装文件夹中 bin 文件夹下用于连接数据库的可执行文件

    快速查看并了解一个数据库

    查询所有数据库: show dbs

    查询所有集合:show collections

    查询集合中的所有文档db.集合名称.find().pretty()
    注意:某些版本下,若集合中文档过多,则会只返回部分文档。pretty()方法用于以格式化的方式来显示所有文档,方便查看。

    查询集合中的部分文档db.集合名称.find().limit(查询数量)
    注意:若集合中文档数量过多,则建议使用该方法,以免卡死整个数据库。

    统计集合中文档数量db.集合名称.find().count()

    数据库的查询

    由于mongo数据库是非关系类型的,意味着其查询会非常依赖索引,若查询条件的json字段未添加索引,mongo会把该集合的所有文档加载进内存进行遍历。在文档数量较多的情况下,会非常轻易的挤爆内存,造成数据库崩溃。

    mongo的查询条件也是一串json,所以要注意,字符串需要带引号的。

    具体查询方法可以参考菜鸟教程

    补充一个菜鸟教程中没有提到的查询条件
    查询不包含某个字段的文档db.集合名称.find( { "指定字段": {$exists: false } } )

    java 连接 mongoDb 数据库

    首先,maven引入依赖

    
    <dependency>
        <groupId>org.mongodbgroupId>
        <artifactId>mongo-java-driverartifactId>
        <version>3.12.11version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    java 连接数据库的官方文档

    连接数据库

    // 引入的类
    import com.mongodb.client.MongoClient;
    import com.mongodb.client.MongoClients;
    import com.mongodb.client.MongoDatabase;
    import com.mongodb.client.MongoIterable;
    
    // 连接数据库代码片段
    public void connect(MongoDb db)
    {
    	// MongoDb 类是我自己打包的一个类,主要用于存储连接数据库需要的 机器地址 端口号等信息
        String connectStr;
        if (db.getUser() == null) // 不带密码
            connectStr = "mongodb://" + db.getHost() + ":" + db.getPort() + "/" + db.getUserDb();
        else // 带有用户名和密码的
            connectStr = "mongodb://" + db.getUser() + ":" + db.getPassword() + "@"
                    + db.getHost() + ":" + db.getPort() + "/" + db.getUserDb();
        MongoClient client = MongoClients.create(connectStr);
        MongoDatabase database = client.getDatabase(db.getDatabase());
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    查询

    /**
     * 查询当前数据库中的所有集合
     */
    public Set<String> showCollections()
    {
    	// db 是连接数据库代码中获取的 MongoDatabase 类
        if (db == null)
            throw new RuntimeException("not use database.");
        MongoIterable<String> mongoIterable = db.listCollectionNames();
        Set<String> set = new HashSet<>();
        for (String name : mongoIterable)
            set.add(name);
        return set;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    关于查询条件,文档中有详细介绍,下面举一个例子:
    需要了解更多的可以点击跳转到文档:组建查询条件组建排序条件

    Bson query1 = Filters.lte("abc", 123); // 查询 abc 的值小于等于 123 的所有文档
    Bson sort1 = Sorts.descending("abc"); // 以abc字段做降序排序
    // db 是连接数据库代码中获取的 MongoDatabase 类
    Document doc = db.getCollection("要查找的集合名称").find(query1).sort(sort1).first(); // 查找第一个文档
    
    • 1
    • 2
    • 3
    • 4

    插入和删除

    // db 是连接数据库代码中获取的 MongoDatabase 类
    String collection = "要修改的集合名称";
    // 插入一个文档
    Document doc1 = new Document();
    doc1.put("abc", 112);
    db.getCollection(collection).insertOne(doc1);
    // 删除 abc 的值小于等于 123 的所有文档
    Bson query1 = Filters.lte("abc", 123);
    db.getCollection(collection).deleteMany(query1);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 相关阅读:
    Universal Data Access Components (UniDAC) 9.3.0
    kafka详解二
    pandas(综合测试)
    C++基于Qt中QOpenGLWidget模块实现的画图板源码+可执行文件
    马上金九银十了,简历该准备起来了,看这里
    使用AOP做日志切面
    LeetCode[112]路径总和
    Python文本处理:初探《三国演义》
    Yakit工具篇:专项漏洞检测的配置和使用
    Mongo 服务器上的 CPU 使用率很高,但 Mongo 似乎处于空闲状态
  • 原文地址:https://blog.csdn.net/weixin_44927769/article/details/126278645