php mongoDb学习笔记

分类: 软件应用 > MongoDB

一、php mongoDb学习

  1. Mongoclient类:

    1. 简介:PHP和MongoDB的连接管理器,这个类用户创建和管理连接。

    2. 用法:

      $m = new MongoClient(); //连接

      $db = $m->foo; 获取名称为“foo”的数据库

    3. 预定义常量:

      1. MongoClient::VERSION — PHP驱动版本

      2. MongoClient::DEFAULT_HOST — 如果没有指定主机,默认连接该主机

      3. MongoClient::DEFAULT_PORT — 如果没有指定端口,默认连接该端口

      4. MongoClient::RP_PRIMARY — 副本集活跃节点的读取选项

      5. MongoClient::RP_PRIMARY_PREFERRED — 副本集活跃节点的读取选项。

      6. MongoClient::RP_SECONDARY — 副本集备份节点的读取选项。

      7. MongoClient::RP_SECONDARY_PREFERRED — 副本集备份节点的读取选项。

      8. MongoClient::RP_NEAREST — 副本集最近节点的读取选项。

    4. 字段属性:

      1. connected

        如果我们有一个打开的、基于读取选项和标记集(对于集群连接)的数据库连接,将会被设置为 TRUE,否则是 FALSE。

    5. 类方法:

      MongoClient::close — 关闭连接

      MongoClient::connect — 连接到数据库服务器

      MongoClient::__construct — 创建一个新的数据库连接对象

      MongoClient::dropDB — 删除一个数据库 [已废弃]

      MongoClient::__get — 取得一个数据库

      MongoClient::getConnections — 返回所有已打开连接的信息

      MongoClient::getHosts — 更新所有关联主机的状态信息

      MongoClient::getReadPreference — 获取此连接的读取首选项

      MongoClient::getWriteConcern — 获取此链接的写关系

      MongoClient::killCursor — 关闭服务器中指定的光标

      MongoClient::listDBs — 列出所有有效数据库

      MongoClient::selectCollection — 获取数据库的文档集

      MongoClient::selectDB — 获取一个数据库

      MongoClient::setReadPreference — 为该连接设置读取选项

      MongoClient::setWriteConcern — 设置此链接的写关系 

      MongoClient::__toString — 该连接的字符串表达方式

  2. MongoDb 类:

    1. 简介:该类的实例用于和数据库进行交互。要获取一个数据库

    2. 用法:

      $m = new MongoClient(); // 连接

      $db = $m->selectDB("example"); //数据库名可以用 ASCII 范围内的几乎任何字符。 但是,它们不能包括 " "、".",或者是空字符串。 名称 "system" 也是被保留的。

    3. 预定义变量:

      1. MongoDB::PROFILING_OFF — 关闭了分析器

      2. MongoDB::PROFILING_SLOW 为慢操作开启了分析器(>100 ms)。

      3. MongoDB::PROFILING_ON 为所有操作开启了分析器。

    4. 类方法:

      MongoDB::authenticate — 登录到数据库

      MongoDB::command — 执行一条 Mongo 指令

      MongoDB::__construct — 选择一个数据库

      MongoDB::createCollection — 创建一个集合

      MongoDB::createDBRef — 创建数据库引用

      MongoDB::drop — 丢弃数据库

      MongoDB::dropCollection — 丢弃一个集合

      MongoDB::execute — 在数据库服务器上运行JavaScript

      MongoDB::forceError — 创建一个数据库错误

      MongoDB::__get — 获取一个集合

      MongoDB::getCollectionInfo — 在数据库中,集合的返回信息

      MongoDB::getCollectionNames — 在数据库中,返回所有集合的名称(数组)

      MongoDB::getDBRef — 数据库参数

      MongoDB::getGridFS —处理存储在该数据库文件的工具包

      MongoDB::getProfilingLevel — 获取该数据库的等级水平

      MongoDB::getReadPreference — 首选读取数据库

      MongoDB::getSlaveOkay — Get slaveOkay setting for this database

      MongoDB::getWriteConcern — Get the write concern for this database

      MongoDB::lastError — Check if there was an error on the most recent db operation performed

      MongoDB::listCollections — Gets an array of MongoCollection objects for all collections in this database

      MongoDB::prevError — Checks for the last error thrown during a database operation

      MongoDB::repair — Repairs and compacts this database

      MongoDB::resetError — Clears any flagged errors on the database

      MongoDB::selectCollection — Gets a collection

      MongoDB::setProfilingLevel — Sets this database's profiling level

      MongoDB::setReadPreference — Set the read preference for this database

      MongoDB::setSlaveOkay — Change slaveOkay setting for this database

      MongoDB::setWriteConcern — Set the write concern for this database

      MongoDB::__toString — The name of this database

  3. MongoCollection类:

    1. 简介:MongoDB集合

    2. 预定义常量:

      1. MongoCollection::ASCENDING --- 索引的上升方向

      2. MongoCollection::DESCENDING --- 索引的下降方向

    3. 类方法:

      MongoCollection::aggregate — Perform an aggregation using the aggregation framework

      MongoCollection::aggregateCursor — Execute an aggregation pipeline command and retrieve results through a cursor

      MongoCollection::batchInsert — Inserts multiple documents into this collection

      MongoCollection::__construct — 创建一个新的集合

      MongoCollection::count — 返回集合中的文档数量

      MongoCollection::createDBRef — 创建一个数据库引用

      MongoCollection::createIndex — Creates an index on the specified field(s) if it does not already exist.

      MongoCollection::deleteIndex — Deletes an index from this collection

      MongoCollection::deleteIndexes — 删除集合的所有索引

      MongoCollection::distinct — 获取集合里指定键的不同值的列表。

      MongoCollection::drop — 删除该集合

      MongoCollection::ensureIndex — Creates an index on the specified field(s) if it does not already exist.

      MongoCollection::find — 查看集合中的数据

      MongoCollection::findAndModify — Update a document and return it

      MongoCollection::findOne — Queries this collection, returning a single element

      MongoCollection::__get — Gets a collection

      MongoCollection::getDBRef — Fetches the document pointed to by a database reference

      MongoCollection::getIndexInfo — Returns information about indexes on this collection

      MongoCollection::getName — 返回这个集合的名称

      MongoCollection::getReadPreference — Get the read preference for this collection

      MongoCollection::getSlaveOkay — Get slaveOkay setting for this collection

      MongoCollection::getWriteConcern — Get the write concern for this collection

      MongoCollection::group — Performs an operation similar to SQL's GROUP BY command

      MongoCollection::insert — 在集合中插入文档

      MongoCollection::parallelCollectionScan — Returns an array of cursors to iterator over a full collection in parallel

      MongoCollection::remove — 从集合中删除记录

      MongoCollection::save — 保存一个文档到集合

      MongoCollection::setReadPreference — Set the read preference for this collection

      MongoCollection::setSlaveOkay — Change slaveOkay setting for this collection

      MongoCollection::setWriteConcern — Set the write concern for this database

      MongoCollection::toIndexString — Converts keys specifying an index to its identifying string

      MongoCollection::__toString — String representation of this collection

      MongoCollection::update — 更新数据

      MongoCollection::validate — Validates this collection

  4. MongoCursor类:

    1. 简介:游标是用来遍历数据库查询的结果

    2. 类方法说明:

      MongoCursor::addOption — Adds a top-level key/value pair to a query

      MongoCursor::awaitData — Sets whether this cursor will wait for a while for a tailable cursor to return more data

      MongoCursor::batchSize — Limits the number of elements returned in one batch.

      MongoCursor::__construct — Create a new cursor

      MongoCursor::count — Counts the number of results for this query

      MongoCursor::current — Returns the current element

      MongoCursor::dead — Checks if there are results that have not yet been sent from the database

      MongoCursor::doQuery — Execute the query.

      MongoCursor::explain — Return an explanation of the query, often useful for optimization and debugging

      MongoCursor::fields — Sets the fields for a query

      MongoCursor::getNext — Advances the cursor to the next result, and returns that result

      MongoCursor::getReadPreference — Get the read preference for this query

      MongoCursor::hasNext — Checks if there are any more elements in this cursor

      MongoCursor::hint — Gives the database a hint about the query

      MongoCursor::immortal — Sets whether this cursor will timeout

      MongoCursor::info — Gets information about the cursor's creation and iteration

      MongoCursor::key — Returns the current result's _id, or its index within the result set

      MongoCursor::limit — Limits the number of results returned

      MongoCursor::maxTimeMS — Sets a server-side timeout for this query

      MongoCursor::next — Advances the cursor to the next result, and returns that result

      MongoCursor::partial — If this query should fetch partial results from mongos if a shard is down

      MongoCursor::reset — Clears the cursor

      MongoCursor::rewind — Returns the cursor to the beginning of the result set

      MongoCursor::setFlag — Sets arbitrary flags in case there is no method available the specific flag

      MongoCursor::setReadPreference — Set the read preference for this query

      MongoCursor::skip — Skips a number of results

      MongoCursor::slaveOkay — Sets whether this query can be done on a secondary [deprecated]

      MongoCursor::snapshot — Use snapshot mode for the query

      MongoCursor::sort — Sorts the results by given fields

      MongoCursor::tailable — Sets whether this cursor will be left open after fetching the last results

      MongoCursor::timeout — Sets a client-side timeout for this query

      MongoCursor::valid — Checks if the cursor is reading a valid result.

二、MongoDB教程学习:

  1. Mongodb管理工具:

    1. 监控:Munin、Gangila、Cacti

    2. GUI:Fang of Mongo、Futon4Mongo、Mongo3、MongoHub、Opricot、Database Master、RockMongo

  2. MongoDB数据库,对象,集合

    1. 数据库:

      1. 一个mongodb中可以建立多个数据库。

      2. MongoDB的默认数据库为"db",该数据库存储在data目录中。

      3. "show dbs" 命令可以显示所有数据的列表。

      4. 执行 "db" 命令可以显示当前数据库对象或集合。

      5. 运行"use"命令,可以连接到一个指定的数据库。

      6. 备注:

        1. 数据库名称可以是任何字符,但是不能包含空字符串,点号(.),或者" "。

        2. "system" 作为系统保留字符串不能作为数据库名。

        3. 数据库名不能包含 "$"。

    2. 文档:存储为bson数据,可以理解为在json的基础上添加了一些json中没有的数据类型。

      1. 简介:文档是mongodb中的最核心的概念,是其核心单元,可以将文档类比成关系型数据库中的每一行数据。

      2. 关系型数据库 -> MongoDB:

        1. Table(表) -> Collection(集合)

        2. Column(栏)-> Key(键)

        3. Value(值)-> Value(值)

        4. Records/Rows(记录/列)-> Document / Object(文档/对象)

      3. MongoDB中常用的集中数据类型:

        1. string(字符串)、integer(整型)、boolean(布尔型)、double(双精度浮点型)、null、array、object、timestamp、Internationalized Strings、Object IDs

    3. 集合:

      1. 简介:集合就是一组文档的组合,在mongodb中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的

      2. 合法的集合名:

        1. 集合名称必须以字母或下划线开头

        2. 集合名可以保护数字

        3. 集合名称不能使美元符"$"

        4. 集合的名字最大不能超过128个字符

    4. 元数据:

      1. 数据库的信息是存储在集合中。它们使用了系统的命名空间:dbname.system.*

      2. dbname.system.namespaces --- 列出所有名字空间。

      3. dbname.system.indexs --- 列出所有索引

      4. dbname.system.profile --- 包含数据库概要(profile)信息。

      5. dbname.system.users --- 列出所有可访问数据库的用户。

      6. dbname.local.sources --- 包含复制对端(slave)的服务器信息和状态。

  3. MongoDB - 连接:

    1. shell命令来连接服务:

      1. mongodb://username:password@localhost/dbname

      2. ./bin/mongo localhost:27017

      3. 重新连接mongodb:numactl --interleave=all bin/mongod -f conf/mongo.conf

    2. 插入数据:

      1. db.collection.insert(document)

    3. 查询数据:

      1. db.collection.find()

      2. 条件操作符:

        1. (>) 大于 - $gt

        2. (<) 小于 - $lt

        3. (>=) 大于等于 - $gte

        4. (<= ) 小于等于 - $lte

        5. (!=)不等于 - $ne

        6. $type --- 基于BSON类型来检索集合中匹配的结果(类型描述->类型值)

      3. Limit、Skip、sort方法

        1. limit() --- MongoDB中读取指定数量的数据记录

          db.collection.find().limit()

        2. skip() --- 使用skip()方法来跳过指定数量的数据

          db.collection.find().skip()

        3. sort() --- 通过参数(1、-1)指定排序的字段

          db.collection.find().sort({key:1})

    4. 更新数据:

      1. db.collection.update( criteria, objNew, upsert, multi )

        1. criteria : update的查询条件,类似sql update查询内where后面的

        2. objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的(如果不更改其他字段,需要加上'$set' => {})

        3. upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。

        4. multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新

    5. 删除数据:

      1. db.collection.remove({})

    6. 删除集合:

      1. db.collection.drop()

    7. 删除数据库:

      1. db.dropDatabase()

    8. MongoDB索引:

      1. ensureIndex({}, {}) --- 方法来创建索引,第二个参数接收可选参数

        db.collection.ensureIndex({KEY:1})

        //1为指定按升序创建索引

        //可以设置使用多个字段创建索引

    9. MongoDB 聚合

      1. aggregate() --- 聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果

        db.collection.aggregate([{$group:{}}])

      2. 聚合的表达式:

        1. $sum --- 计算总和

        2. $avg --- 计算平均值

        3. $min --- 获取集合中所有文档对应值得最小值

        4. $max --- 获取集合中所有文档对应值得最大值

        5. $push --- 在结果文档中插入值到一个数组中

        6. $addToSet --- 在结果文档中插入值到一个数组中,但不创建副本

        7. $first --- 根据资源文档的排序获取第一个文档数据。

        8. $last --- 根据资源文档的排序获取最后一个文档数据

  4. mongodb的安装:

三、imooc中mongoDB学习:

  1. 索引的学习:

    1. 索引的种类:

      1. _id索引

      2. 单键索引

        1. db.collection.ensureIndex({index:1});

      1. 多键索引

      2. 复合索引

        1. db.collection.ensureIndex({index1:1, index2:1})

      3. 过期索引

        1. db.collection.ensureIndex({index:1}, {expireAfterSeconds: 10})

        2. 存储在过期索引字段的值必须是指定的时间类型。(说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能自动删除)

        3. 如果指定了ISODate数组,则按照最小的时间进行删除

        4. 过期索引不能是复合索引

        5. 删除时间不是精确(说明:删除过程是后台程序每60s跑一次,而且删除也需要一些时间,所以存在误差)

      4. 全文索引

        1. 对字符串与字符串数组创建全文可搜索的索引

        2. db.collection.ensureIndex({index: text})

        3. db.collection.ensureIndex({$**: text})    //对集合中所有字段建立一个全文索引

        4. 使用全文索引查询:

          1. db.collection.find("$text": {"$search":"aa"})                      //查找全文索引字段中带有aa的

          2. db.collection.find("$text": {"$search":"aa bb"})                 //查找全文索引字段中带有aa或者bb的

          3. db.collection.find("$text": {"$search":"aa -bb"})               //查找全文索引字段中带有aa,但不带bb的

          4. db.collection.find("$text": {"$search":"\"aa\" \"bb\""})      //查找全文索引字段中既带有aa又带有bb的

        5. 使用全文索引相似度查询:

          1. $meta操作符:{score: {$meta: "textScore"}}

          2. 写在查询条件后面可以返回结果的相似度

          3. 与sort一起使用,可以达到更好的实用效果

          4. db.collection.find("$text": {"$search":"aa bb"}, {score: {$meta: "textScore}}).sort({score: {$meta: "textScore}})

        6. 全文索引的使用限制:

          1. 每次查询,只能指定一个$text查询

          2. $text查询不能出现在$nor查询中

          3. 查询中如果包含$text,hint不再起作用

          4. MongoDB全文索引还不支持中文

      5. 地理位置索引

        1. 概念:将一些点的位置存储在MongoDb中,创建索引之后,可以按照位置来查找其他点。

        2. 子分类:

          1. 2d索引:用户存储和查找平面上的点

          2. 2dsphere索引,用于存储和查找球面上的点

        3. 查找方法:

          1. 查找距离某个点一定距离内的点

          2. 查找包含在某个区域内的点

    2. 索引属性

      1. name指定: db.collection.ensureIndex({index: text}, {name: ""});

      2. unique指定(唯一性):db.collection.ensureIndex({index: text}, {unique: true/false});

      3. sparse指定(稀疏性):db.collection.ensureIndex({index: text}, {sparse: true/false});     //是否为不存在的字段建立索引

      4. expireAfterSeconds(是否定时删除) db.collection.ensureIndex({index: text}, {expireAfterSeconds: 10});

    3. 索引的方法:

      1. 获取索引:db.collection.getIndexes()

      2. 删除索引:db.collection.dropIndex("")

    4. explain:查询分析

      1. db.collection.find().explain()

  2. MongoDB安全概览

    1. 最安全的是物理隔离:不现实

    2. 网络隔离其次

    3. 防火墙再隔离

    4. 用户名密码在最后

      1. MongoDB创建用户:

        1. 创建语法:db.createUser()

        2. 创建语句:db.createUser({user:"", pwd:"", customData: "", roles: [{role: "", db: ""}]})

        3. 角色类型:内建类型(read, readWrite, dbAdmin, dbOwner, userAdmin)

      2. MongoDB用户角色详解:

        1. 角色类型:内建类型(read, readWrite, dbAdmin, dbOwner, userAdmin)

        2. 集群角色(clusterAdmin,clusterManager)

        3. 备份角色(backup,restore)

        4. 其他特殊权限(DBAdminAnyDatabase)

      3. 创建用户角色权限:

        1. 创建语法:db.craeteRole()

        2. 创建语句:{_id: "", role: "", db: "", privileges: [{resource: {db: "", collection: "", actions: {"find", "update"}}}], roles: []}

  3. MognoDB集群技术

    1. 多种技术:

        1. 副本级集群(Replication)

          1. 实现意义:数据冗余,提升读性能;架构上:中心化;实现原理上:数据镜像;维护成本:相对容易

        2. 分片技术(Shard)

          1. 实现意义:提升并发性能;架构上:水平化;实现原理上:数据打散分布;维护成本:相对较高

    2. 分片技术介绍:

      1. 概念:是将多个数据进行拆分,讲数据水平的分散到不同的服务器上

      2. 作用:

        1. 架构上:读写均衡,去中心化

        2. 结构上:12节点(version<=2.6)

        3. 硬件上:内存、硬盘容量限制

      3. 什么时候考虑分片:

        1. 因为mongoDB是比较费内存,当硬件、部署瓶颈

        2. 当查询效率或者锁表严重时

      4. 分片的目的:

        1. 改善单台机器数据的存储及数据吞吐性能

        2. 提高在大量数据下随机访问性能

      5. 分片- 成员节点介绍:

        1. Shard节点:存储数据的节点(单个mongod或者副本集)

        2. Config server:存储元数据,为mongos服务,将数据路由到Shard

        3. mongos:接收前端请求,进行对应信息路由。

      6. 分片 - 成员节点启动参数

        1. Shard节点://192.168.1.221

          1. mongod --shardsvr / mongod -shardsvr -rpelSet副本集

          2. mongod --shardsvr --logpath=/path/shard.log --logappend --dbpath=/path/shard --fork --port 27017

        2. Config server: //192.168.1.221

          1. mongod --configsvr

          2. mongod --configsvr --logpath=/path/config.log --logappend --dbpath=/path/config --fork --port 27018

        3. Mongos: //192.169.1.222

          1. mongos -configdb <configdb server>

          2. mongos --port 27017 --logappend --logpath=/path/mongos.log --configdb 127.0.0.1:27018 --fork

      7. 分片 - 添加分片过程

        1. 链接到mongos

        2. Add Shards

          1. 单个数据实例:do.runCommand({addShard: "<hostname><:port>", maxSize: <size>, name: "<shard_name>"}) 

          2. 副本集群:do.runCommand( {addShard: "<replica_set>/<hostname><:port>", maxSize: <size>, name: "<shard_name>"})

          3. 如果你的mongo和shard在同一台机器上,添加分片不能使用“localhost”,建议使用IP

        3. Enable Sharding(eabled数据库)

          1. db.runcommand({enablesharding: "<shard>"})

        4. 对一个集合进行分片

          1. db.runCommand({shardcollection: "<namespace>", key: "<key>"})

          2. unique: "true/false"   //启动对shard key的唯一性约束,保证所有分片合并起来的唯一值

          3. shard key选择

      8. 分片 - 案例: //192.168.1.222

        1. use admin

        2. do.runCommand({addShard: "192.168.1.221:27017"}) //连接

        3. db.runCommand({enablesharding: "shardtest"}) //连接 数据库(打开分片)

        4. db.runCommand({shardcollection: "shardtest.userid", key: "{userid: 1}"}) //连接集合(片健可以用复合字段组合)

        5. 多个shard,则执行步骤2

        6. use config

        7. db.shards.find()  //查询所有的分片shard

      9. 分片 - 测试

        1. 查看集合的状态:use shardtest; db.userid.stat();

        2. 查看分片状态:db.printShardingStatus();

      10. 分片 - shard key

        1. 分片片健概念:集合里面选一个健,用该健的值作为数据拆分的依据

        2. Chunk: Mongodb分片后,存储数据的单元块,默认大小:64MB

      11. 分片 - chunk拆分

        1. 数据库(chunk)拆分:记录每个快中插入多少数据,一旦达到某个阀值,执行检查是否需要拆分块,需要则更新config服务器上这个块的元信息

      12. 分片 - balancing

        1. 数据块平衡:均衡器负责数据的迁移,会周期性的检查分片是否存在不均衡,如果存在则会进行块的迁移

        2. 注意:均衡器进行均衡的条件是块数量的多少,而不是块的大小

      13. 分片 - 哈希分片

        1. 分片过程中利用哈希索引作为分片的单个健

        2. 好处:哈希分片的片健只能使用一个字段,哈希片健最大的好处就是保证数据在各个节点分布基本均匀

        3. shardcollection ==> {user_id: hashed}

      14. 分片 - 如果选择合适片健

        1. 选择片健的好坏很大程度上影响集群的性能,容量和功能

        2. 考虑因素一:

          1. 数据块的大小(影响:片健相同导致数据块不拆分,容易形成大的数据块,导致数据不均)

          2. 数据写均匀分布(影响:单调递增的'_id'或时间戳作为片健,这样将会导致你一直往最后一个副本集中添加数据)

      15. 分片 - 请求查询机制:

        1. Routed Request:路由查询

        2. Scatter Gather Request:分散聚合查询

        3. Distributed Merge Sort Req:分布式合并排序查询

      16. 分片 - 手动分片

        1. 作用:为了减少自动平衡过程带来的IO等资源消耗

        2. 前提:

          1. 关闭自动平衡,关闭auto balance

          2. 充分了解数据,并对数据进行预先划分

        3. 步骤:

          1. 关闭自动平衡

            1. 关闭方式:sh.stopBalancer()

            2. 启动方式:sh.startbalancer()

            3. 查看平衡器状态:Currently enabled: no

          2. 分片切割

          3. 手动移动分割块

      17. 分片 - 部署场景(考虑因素)

        1. 预估数据增长量

        2. 预估集群的访问量

        3. 预估投入成本(硬件、人员维护等)

来源:原创 发布时间:2021-08-19 22:02:57