喻轩Blog - MongoDB
type: channel
link: https://blog.yuxuan.io/categories/mongodb
description: MongoDB
items: MongoDB安全认证
items: MongoDB集群高可用
items: MongoDB架构
items: MongoDB应用实战
items: MongoDB索引
items: MongoDB命令
items: MongoDB体系结构

MongoDB安全认证
type: item
date: 2020-08-30T21:29:54+08:00
description: 安全认证概述MongoDB 默认是没有账号的，可以直接连接，无须身份验证。实际项目中肯定是要权限验证的，否则后果不堪设想。从2016年开始，发生了多起MongoDB黑客赎金事件，大部分MongoDB安全问题暴露出了安全问题的短板其实是用户，首先用户对于数据库的安全不重视，其次用户在使用过程中可能没有养成定期备份的好习惯，最后是企业可能缺乏有经验和技术的专业人员。所以对MongoDB进行安全认证是必须要做的。用户相关操作切换到admin数据库对用户的添加use admin; /*用于创建 MongoDB 登录用户以及分配权限的方法*/ db.createUser(userDocument)db.createUser( { user: "账号", pwd: "密码", roles: [ { role: "角色", db: "安全认证的数据库" }, { role: "角色", db: "安全认证的数据库" } ] } ) user：创建的用户名称，如 admin、root 、xxxpwd：用户登录的密码roles：为用户分配的角色，不同的角色拥有不同的权限，参数是数组，可以同时设置多个role：角色，MonngoDB 已经约定好的角色，不同的角色对应不同的权限 后面会对role做详细解释db：数据库实例名称，如 MongoDB 4.0.2 默认自带的有 admin、local、config、test 等，即为哪个数据库实例设置用户举例:use admin db.createUser( { user:"root", pwd:"123321", roles:[{role:"root",db:"admin"}] } )修改密码db.changeUserPassword( 'root' , 'rootNew' );用户添加角色db.grantRolesToUser( '用户名' , [{ role: '角色名' , db: '数据库名'}])以auth启动mongod./bin/mongod -f conf/mongo.conf --auth也可以在 mongo.conf 中添加 auth=true 参数验证用户db.auth("账号","密码")删除用户db.dropUser("用户名")角色数据库内置的角色read：允许用户读取指定数据库readWrite：允许用户读写指定数据库dbAdmin：允许用户在指定数据库中执行管理函数，如索引创建、删除，查看统计或访问system.profileuserAdmin：允许用户向system.users集合写入，可以找指定数据库里创建、删除和管理用户clusterAdmin：只在admin数据库中可用，赋予用户所有分片和复制集相关函数的管理权限readAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读权限readWriteAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的读写权限userAdminAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的userAdmin权限dbAdminAnyDatabase：只在admin数据库中可用，赋予用户所有数据库的dbAdmin权限root：只在admin数据库中可用。超级账号，超级权限dbOwner：库拥有者权限，即readWrite、dbAdmin、userAdmin角色的合体各个类型用户对应的角色数据库用户角色：read、readWrite数据库管理角色：dbAdmin、dbOwner、userAdmin集群管理角色：clusterAdmin、clusterManager、clusterMonitor、hostManager备份恢复角色：backup、restore；所有数据库角色：readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase超级用户角色：root这里还有几个角色间接或直接提供了系统超级用户的访问（dbOwner 、userAdmin、userAdminAnyDatabase）单机安全认证实现流程创建 mydb1 数据库并创建了两个用户，zhangsan 拥有读写权限，lisi 拥有只读权限测试这两个账户的权限。以超级管理员登录测试权限。创建管理员MongoDB 服务端开启安全检查之前，至少需要有一个管理员账号，admin 数据库中的用户都被视为管理员。如果 admin 库没有任何用户的话，即使在其他数据库中创建了用户，启用身份验证，默认的连接方式依然会有超级权限，即仍然可以不验证账号密码照样能进行 CRUD，安全认证相当于无效。>use admin switched to db…

MongoDB集群高可用
type: item
date: 2020-08-30T21:14:06+08:00
description: MongoDB主从复制架构原理和缺陷master-slave架构中master节点负责数据的读写，slave没有写入权限只负责读取数据。在主从结构中，主节点的操作记录成为oplog（operation log）。oplog存储在系统数据库local的oplog.$main集合中，这个集合的每个文档都代表主节点上执行的一个操作。从服务器会定期从主服务器中获取oplog记录，然后在本机上执行！对于存储oplog的集合，MongoDB采用的是固定集合，也就是说随着操作过多，新的操作会覆盖旧的操作！主从结构没有自动故障转移功能，需要指定master和slave端，不推荐在生产中使用。mongodb4.0后不再支持主从复制！[main] Master/slave replication is no longer supported复制集replica sets什么是复制集复制集是由一组拥有相同数据集的mongod实例做组成的集群。复制集是一个集群，它是2台及2台以上的服务器组成，以及复制集成员包括Primary主节点,secondary从节点和投票节点。复制集提供了数据的冗余备份，并在多个服务器上存储数据副本，提高了数据的可用性，保证数据的安全性。为什么要使用复制集高可用防止设备（服务器、网络）故障。提供自动failover 功能。技术来保证高可用灾难恢复当发生故障时，可以从其他节点恢复，用于备份。功能隔离我们可以在备节点上执行读操作，减少主节点的压力，比如:用于分析、报表，数据挖掘，系统任务等。复制集集群架构原理一个复制集中Primary节点上能够完成读写操作，Secondary节点仅能用于读操作。Primary节点需要记录所有改变数据库状态的操作，这些记录保存在 oplog 中，这个文件存储在 local 数据库，各个Secondary节点通过此 oplog 来复制数据并应用于本地，保持本地的数据与主节点的一致。oplog 具有幂等性，即无论执行几次其结果一致，这个比 mysql 的二进制日志更好用。oplog的组成结构{ "ts" : Timestamp(1446011584, 2), "h" : NumberLong("1687359108795812092"), "v" : 2, "op" : "i", "ns" : "test.nosql", "o" : { "_id" : ObjectId("563062c0b085733f34ab4129"), "name" : "mongodb", "score" : "10"} }ts：操作时间，当前timestamp + 计数器，计数器每秒都被重置h：操作的全局唯一标识v：oplog版本信息op：操作类型 i：插入操作 u：更新操作 d：删除操作 c：执行命令（如createDatabase，dropDatabase）n：空操作，特殊用途ns：操作针对的集合o：操作内容o2：更新查询条件，仅update操作包含该字段复制集数据同步分为初始化同步和keep复制同步。初始化同步指全量从主节点同步数据，如果Primary节点数据量比较大同步时间会比较长。而keep复制指初始化同步过后，节点之间的实时同步一般是增量同步。初始化同步有以下两种情况会触发：(1) Secondary第一次加入。(2) Secondary落后的数据量超过了oplog的大小，这样也会被全量复制。MongoDB的Primary节点选举基于心跳触发。一个复制集N个节点中的任意两个节点维持心跳，每个节点维护其他N-1个节点的状态。心跳检测：整个集群需要保持一定的通信才能知道哪些节点活着哪些节点挂掉。mongodb节点会向副本集中的其他节点每2秒就会发送一次pings包，如果其他节点在10秒钟之内没有返回就标示为不能访问。每个节点内部都会维护一个状态映射表，表明当前每个节点是什么角色、日志时间戳等关键信息。如果主节点发现自己无法与大部分节点通讯则把自己降级为secondary只读节点。主节点选举触发的时机:第一次初始化一个复制集Secondary节点权重比Primary节点高时，发起替换选举Secondary节点发现集群中没有Primary时，发起选举Primary节点不能访问到大部分(Majority)成员时主动降级当触发选举时，Secondary节点尝试将自身选举为Primary。主节点选举是一个二阶段过程+多数派协议。第一阶段:检测自身是否有被选举的资格，如果符合资格会向其它节点发起本节点是否有选举资格的FreshnessCheck，进行同僚仲裁第二阶段:发起者向集群中存活节点发送Elect(选举)请求，仲裁者收到请求的节点会执行一系列合法性检查，如果检查通过，则仲裁者(一个复制集中最多50个节点 其中只有7个具有投…

MongoDB架构
type: item
date: 2020-08-30T20:38:14+08:00
description: MongoDB逻辑结构MongoDB 与 MySQL 中的架构相差不多，底层都使用了可插拔的存储引擎以满足用户的不同需要。用户可以根据程序的数据特征选择不同的存储引擎,在最新版本的 MongoDB 中使用了 WiredTiger 作为默认的存储引擎，WiredTiger 提供了不同粒度的并发控制和压缩机制，能够为不同种类的应用提供了最好的性能和存储率。在存储引擎上层的就是 MongoDB 的数据模型和查询语言了，由于 MongoDB 对数据的存储与 RDBMS 有较大的差异，所以它创建了一套不同的数据模型和查询语言。MongoDB的数据模型描述数据模型内嵌内嵌的方式指的是把相关联的数据保存在同一个文档结构之中。MongoDB的文档结构允许一个字段或者一个数组内的值作为一个嵌套的文档。引用引用方式通过存储数据引用信息来实现两个不同文档之间的关联,应用程序可以通过解析这些数据引用来访问相关数据。如何选择数据模型选择内嵌:1）数据对象之间有包含关系 ,一般是数据对象之间有一对多或者一对一的关系 。2）需要经常一起读取的数据。3）有 map-reduce/aggregation 需求的数据放在一起，这些操作都只能操作单个 collection。选择引用:1）当内嵌数据会导致很多数据的重复，并且读性能的优势又不足于覆盖数据重复的弊端 。2）需要表达比较复杂的多对多关系的时候 。3）大型层次结果数据集 嵌套不要太深。MongoDB存储引擎存储引擎概述存储引擎是MongoDB的核心组件，负责管理数据如何存储在硬盘和内存上。MongoDB支持的存储引擎有MMAPv1 ,WiredTiger和InMemory。InMemory存储引擎用于将数据只存储在内存中，只将少量的元数据(meta-data)和诊断日志（Diagnostic）存储到硬盘文件中，由于不需要Disk的IO操作，就能获取所需的数据，InMemory存储引擎大幅度降低了数据查询的延迟（Latency）。从mongodb3.2开始默认的存储引擎是WiredTiger,3.2版本之前的默认存储引擎是MMAPv1，mongodb4.x版本不再支持MMAPv1存储引擎。storage: journal: enabled: true dbPath: /data/mongo/ ##是否一个库一个文件夹 directoryPerDB: true ##数据引擎 engine: wiredTiger ##WT引擎配置 WiredTiger: engineConfig: ##WT最大使用cache（根据服务器实际情况调节） cacheSizeGB: 2 ##是否将索引也按数据库名单独存储 directoryForIndexes: true journalCompressor:none （默认snappy） ##表压缩配置 collectionConfig: blockCompressor: zlib (默认snappy,还可选none、zlib) ##索引配置 indexConfig: prefixCompression: trueWiredTiger存储引擎优势文档空间分配方式WiredTiger使用的是BTree存储，MMAPV1是线性存储，需要Padding并发级别WiredTiger文档级别锁，MMAPV1引擎使用表级锁数据压缩snappy (默认) 和 zlib，相比MMAPV1(无压缩) 空间节省数倍。内存使用WiredTiger 可以指定内存的使用大小。Cache使用WT引擎使用了二阶缓存WiredTiger Cache，File System Cache来保证Disk上的数据的最终一致性。而 MMAPv1 只有 journal 日志。WiredTiger引擎包含的文件和作用WiredTiger.basecfg: 存储基本配置信息，与 ConfigServer有关系WiredTiger.lock: 定义锁操作table*.wt: 存储各张表的数据WiredTiger.wt: 存储table* 的元数据WiredTiger.turtle: 存储WiredTiger.wt的元数据journal: 存储WAL(Write Ahead Log)WiredTiger存储引擎实现原理写请求WiredTiger的写操作会默认写入Cache ,并持久化到WAL (Write Ahead Log)，每60s或Log文件达到2G做一次checkpoint (当然我们也可以通过在写入时传入 j: true 的参数强制 journal 文件的同步，writeConcern{ w: , j: , wtimeout: }) 产生快照文件。WiredTiger初始化时，恢复至最新的快照状态，然后再根据WAL恢复数据，…

MongoDB应用实战
type: item
date: 2020-08-30T20:19:18+08:00
description: MongoDB的适用场景网站数据：Mongo 非常适合实时的插入,更新与查询，并具备网站实时数据存储所需的复制及高度伸缩性。缓存：由于性能很高，Mongo 也适合作为信息基础设施的缓存层。在系统重启之后，由Mongo搭建的持久化缓存层可以避免下层的数据源过载。大尺寸、低价值的数据：使用传统的关系型数据库存储一些大尺寸低价值数据时会比较浪费，在此之前，很多时候程序员往往会选择传统的文件进行存储。高伸缩性的场景：Mongo 非常适合由数十或数百台服务器组成的数据库，Mongo 的路线图中已经包含对MapReduce 引擎的内置支持以及集群高可用的解决方案。用于对象及JSON 数据的存储：Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。MongoDB的行业具体应用场景游戏场景，使用 MongoDB 存储游戏用户信息，用户的装备、积分等直接以内嵌文档的形式存储，方便查询、更新。物流场景，使用 MongoDB 存储订单信息，订单状态在运送过程中会不断更新，以 MongoDB 内嵌数组的形式来存储，一次查询就能将订单所有的变更读取出来。社交场景，使用 MongoDB 存储存储用户信息，以及用户发表的朋友圈信息，通过地理位置索引实现附近的人、地点等功能。物联网场景，使用 MongoDB 存储所有接入的智能设备信息，以及设备汇报的日志信息，并对这些信息进行多维度的分析。直播，使用 MongoDB 存储用户信息、礼物信息等。如何抉择是否使用MongoDB应用特征Yes/No应用不需要事务及复杂 join 支持必须Yes新应用，需求会变，数据模型无法确定，想快速迭代开发？应用需要2000-3000以上的读写QPS（更高也可以）？应用需要TB甚至 PB 级别数据存储？应用发展迅速，需要能快速水平扩展？应用要求存储的数据不丢失？应用需要99.999%高可用？应用需要大量的地理位置查询、文本查询？一般情况下，满足上面2条及以上就可以选用MongoDBJava访问MongoDBmaven 依赖<dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.10.1</version> </dependency>文档添加MongoClient mongoClient = new MongoClient("192.168.211.133", 37017); MongoDatabase database = mongoClient.getDatabase("mg"); MongoCollection<Document> collection = database.getCollection("mg_preview"); Document document = Document.parse("{name:'lisi',city:'bj',birth_day:new ISODate('2001-08-01'),expectSalary:18000}"); collection.insertOne(document); mongoClient.close();文档查询MongoClient mongoClient = new MongoClient("192.168.211.133", 37017); MongoDatabase database = mongoClient.getDatabase("mg"); MongoCollection<Document> collection = database.getCollection("mg_preview"); Document sdoc = new Document(); //按expectSalary倒序 sdoc.append("expectSalary", -1); FindIterable<Document> findIterable = collection.find().sort(sdoc); for (Document document : findIterable) { System.out.println(document); } mongoClient.close();文档查询过滤MongoClient mongoClient = new MongoClient("192.168.211.133", 37017); MongoDatabase database = mongoClient.getDatabase("mg"); MongoCollection<Document> collection = database.getCollection(…

MongoDB索引
type: item
date: 2020-08-30T19:24:58+08:00
description: 什么是索引索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构，它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录，可以根据目录中的页码快速找到所需的内容。索引目标是提高数据库的查询效率，没有索引的话，查询会进行全表扫描（scan every document in a collection），数据量大时严重降低了查询效率。默认情况下Mongo在一个集合（collection）创建时，自动地对集合的_id创建了唯一索引。索引类型单键索引 (Single Field)MongoDB支持所有数据类型中的单个字段索引，并且可以在文档的任何字段上定义。对于单个字段索引，索引键的排序顺序无关紧要，因为MongoDB可以在任一方向读取索引。单个例上创建索引：db.集合名.createIndex({"字段名":排序方式})特殊的单键索引 过期索引 TTL （ Time To Live）TTL索引是MongoDB中一种特殊的索引，可以支持文档在一定时间之后自动过期删除，目前TTL索引只能在单字段上建立，并且字段类型必须是日期类型。db.集合名.createIndex({"日期字段":排序方式}, {expireAfterSeconds: 秒数})复合索引(Compound Index）通常我们需要在多个字段的基础上搜索表/集合，这是非常频繁的。 如果是这种情况，我们可能会考虑在MongoDB中制作复合索引。 复合索引支持基于多个字段的索引，这扩展了索引的概念并将它们扩展到索引中的更大域。制作复合索引时要注意的重要事项包括：字段顺序与索引方向。db.集合名.createIndex( { "字段名1" : 排序方式, "字段名2" : 排序方式 } )多键索引（Multikey indexes）针对属性包含数组数据的情况，MongoDB支持针对数组中每一个element创建索引，Multikey indexes支持strings，numbers和nested documentsdb.集合名.createIndex({"数组字段名":排序方式})地理空间索引（Geospatial Index）针对地理空间坐标数据创建索引。2dsphere索引，用于存储和查找球面上的点2d索引，用于存储和查找平面上的点db.company.insert( { loc : { type: "Point", coordinates: [ 116.482451, 39.914176 ] }, name: "大望路地铁", category : "Parks" } ) /*建立索引*/ db.company.ensureIndex( { loc : "2dsphere" } ) 参数不是1或-1，为2dsphere 或者 2d。还可以建立组合索引。 /*查找方圆大约5公里内的点*/ db.company.find({ "loc" : { "$geoWithin" : { "$center":[[116.482451,39.914176],0.05] } } })全文索引MongoDB提供了针对string内容的文本查询，Text Index支持任意属性值为string或string数组元素的索引查询。注意：一个集合仅支持最多一个Text Index，中文分词不理想，推荐ES。例如：键入有一个字段内容为 I like coffeedb.集合.createIndex({"字段": "text"}) /*可以查到字段包含coffee的文档*/ db.集合.find({"$text": {"$search": "coffee"}})哈希索引 Hashed Index针对属性的哈希值进行索引查询，当要使用Hashed index时，MongoDB能够自动的计算hash值，无需程序计算hash值。注：hash index仅支持等于查询，不支持范围查询。db.集合.createIndex({"字段": "hashed"})索引和explain分析索引管理创建索引并在后台运行db.COLLECTION_NAME.createIndex({"字段":排序方式}, {background: true});获取针对某个集合的索引db.COLLECTION_NAME.getIndexes()索引的大小db.COLLECTION_NAME.totalIndexSize()索引的重建db.COLLECTION_NAME.reIndex()索引的删除db.COLLECTION_NAME.dropIndex("INDEX-NAME") db.COLLECTION_NAME.dropIndexes() 注意: _id 对应的索…

MongoDB命令
type: item
date: 2020-08-30T18:54:46+08:00
description: MongoDB的基本操作查看数据库show dbs切换数据库，如果没有对应的数据库则创建use 数据库名;创建集合db.createCollection("集合名")查看集合show tables; show collections;删除集合db.集合名.drop();删除当前数据库db.dropDatabase();MongoDB集合数据操作（CURD）数据添加插入单条数据db.集合名.insert(文档)文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。例如:db.mg_preview.insert({name:"张晓峰",birthday:new ISODate("2000-07-01"),expectSalary:15000,gender:0,city:"bj"})没有指定 _id 这个字段，系统会自动生成，当然我们也可以指定 _id_id 类型是ObjectId，是一个12字节 BSON 类型数据，有以下格式：前4个字节表示时间戳，可以通过 ObjectId("对象Id字符串").getTimestamp() 来获取接下来的3个字节是机器标识码紧接的两个字节由进程id组成（PID）最后三个字节是随机数。插入多条数据db.集合名.insert([文档,文档])数据查询比较条件查询db.集合名.find(条件)操作条件格式例子RDBMS中的条件等于{key:value}db.col.find({字段名:值}).pretty()where 字段名=值大于{key:{$gt:value}}db.col.find({字段名:{$gt:值}}).pretty()where 字段名>值小于{key:{$lt:value}}db.col.find({字段名:{$lt:值}}).pretty()where 字段名<值大于等于{key:{$gte:value}}db.col.find({字段名:{$gte:值}}).pretty()where 字段名>=值小于等于{key:{$lte:value}}db.col.find({字段名:{$lte:值}}).pretty()where 字段名<=值不等于{key:{$ne:value}}db.col.find({字段名:{$ne:值}}).pretty()where 字段名!=值pretty()方法是让结果结构化，方便用户查看逻辑条件查询and 条件MongoDB 的 find() 方法可以传入多个键(key)，每个键(key)以逗号隔开，即常规 SQL 的 AND 条件db.集合名.find({key1:value1, key2:value2}).pretty()or 条件db.集合名.find({$or:[{key1:value1}, {key2:value2}]}).pretty()not 条件db.集合名.find({key:{$not:{$操作符:value}}).pretty()分页查询db.集合名.find({条件}).sort({排序字段:排序方式})).skip(跳过的行数).limit(一页显示多少数据)排序方式：-1：降序：升序数据更新 调用updatedb.集合名.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )参数说明：query : update的查询条件，类似sql update查询内where后面的。update : update的对象和一些更新的操作符（如$set,$inc...）等，也可以理解为sql update中set后面的upsert : 可选，这个参数的意思是，如果不存在update的记录，是否插入objNew,true为插入，默认是false，不插入。multi : 可选，MongoDB 默认是false,只更新找到的第一条记录，如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern :可选，用来指定mongod对写操作的回执行为比如写的行为是否需要确认。举例：db.集合名.update({条件},{$set:{字段名:值}},{multi:true}) db.集合名.update({条件},{$unset:{字段名:值}},{multi:true}) db.集合名.update({条件},{$inc:{字段名:值}},{multi:true})$set ：设置字段值$unset :删除指定字段$inc：对要修改的字段原值与对应的值进行相加，例如有这样一个文档集合：{ _id: …

MongoDB体系结构
type: item
date: 2020-08-30T17:47:15+08:00
description: NoSQL 和 MongoDBNoSQL=Not Only SQL，支持类似SQL的功能，与Relational Database相辅相成。其性能较高，不使用SQL意味着没有结构化的存储要求(SQL为结构化的查询语句)，没有约束之后架构更加灵活。NoSQL数据库四大家族 列存储 Hbase，键值(Key-Value)存储 Redis，图像存储 Neo4j，文档存储MongoDB。MongoDB 是一个基于分布式文件存储的数据库，由 C++ 编写，可以为 WEB 应用提供可扩展、高性能、易部署的数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品，是非关系数据库中功能最丰富、最像关系数据库的。在高负载的情况下，通过添加更多的节点，可以保证服务器性能。MongoDB 体系结构MongoDB 和RDBMS(关系型数据库)对比RDBMSMongoDBdatabase（数据库）database（数据库）table（表）collection（集合）row（行）document（BSON 文档）column（列）field（字段）index（唯一索引、主键索引）index（支持地理位置索引、全文索引 、哈希索引）join（主外键关联）embedded Document（嵌套文档）primary key（指定1至N个列做主键）primary key（指定_id field做为主键）什么是BSONBSON是一种类json的一种二进制形式的存储格式，简称Binary JSON，它和JSON一样，支持内嵌的文档对象和数组对象，但是BSON有JSON没有的一些数据类型，如Date和Binary Data类型。BSON可以做为网络数据交换的一种存储形式,是一种schema-less的存储形式，它的优点是灵活性高，但它的缺点是空间利用率不是很理想。{key:value,key2:value2} 这是一个BSON的例子，其中key是字符串类型，后面的value值，它的类型一般是字符串，double，Array，ISODate等类型。BSON有三个特点：轻量性、可遍历性、高效性BSON在MongoDB中的使用MongoDB使用了BSON这种结构来存储数据和网络数据交换。把这种格式转化成一文档这个概念(Document)，这里的一个Document也可以理解成关系数据库中的一条记录(Record)，只是这里的Document的变化更丰富一些，如Document可以嵌套。MongoDB中Document 中 可以出现的数据类型数据类型说明解释说明Document举例String字符串UTF-8 编码的字符串才是合法的。{key:“cba”}Integer整型数值根据你所采用的服务器，可分为 32 位或 64 位。{key:1}Boolean布尔值用于存储布尔值（真/假）。{key:true}Double双精度浮点值用于存储浮点值{key:3.14}ObjectId对象ID用于创建文档的ID{_id:new ObjectId()}Array数组用于将数组或列表或多个值存储为一个键{arr:[“a”,“b”]}Timestamp时间戳从开始纪元开始的毫秒数{ts: new Timestamp()}Object内嵌文档文档可以作为文档中某个key的value{o:{foo:“bar”}}Null空值表示空值或者未定义的对象{key:null}Date或者ISODate格林尼治时间日期时间，用Unix日期格式来存储当前日期或时间。{birth:new Date()}Code代码可以包含JS代码{x:function(){}}File文件1、二进制转码(Base64)后存储 (<16M) 2、GridFS(>16M)GridFS 用两个集合来存储一个文件：fs.files与fs.chunks 真正存储需要使用mongofiles -d gridfs put song.mp3MongoDB在Linux的安装下载社区版 MongoDB 4.1.3去官网下载对应的MongoDB 然后上传到Linux虚拟机将压缩包解压即可tar -zxvf MongoDB-linux-x86_64-4.1.3.tgz启动./bin/mongod指定配置文件方式的启动./bin/mongod -f mongo.conf配置文件样例:dbpath=/data/mongo/ port=27017 bind_ip=0.0.0.0 fork=true logpath = /data/mongo/MongoDB.log logappend = true auth=falseMongoDB启动和参数说明参数说明dbpath数据库目录，默认/data/dbport监听的端口，默认270…