一、php mongoDb学习
-
Mongoclient类:
-
简介:PHP和MongoDB的连接管理器,这个类用户创建和管理连接。
-
用法:
$m = new MongoClient(); //连接
$db = $m->foo; 获取名称为“foo”的数据库
-
预定义常量:
-
MongoClient::VERSION — PHP驱动版本
-
MongoClient::DEFAULT_HOST — 如果没有指定主机,默认连接该主机
-
MongoClient::DEFAULT_PORT — 如果没有指定端口,默认连接该端口
-
MongoClient::RP_PRIMARY — 副本集活跃节点的读取选项
-
MongoClient::RP_PRIMARY_PREFERRED — 副本集活跃节点的读取选项。
-
MongoClient::RP_SECONDARY — 副本集备份节点的读取选项。
-
MongoClient::RP_SECONDARY_PREFERRED — 副本集备份节点的读取选项。
-
MongoClient::RP_NEAREST — 副本集最近节点的读取选项。
-
-
字段属性:
-
connected
如果我们有一个打开的、基于读取选项和标记集(对于集群连接)的数据库连接,将会被设置为 TRUE,否则是 FALSE。
-
-
类方法:
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 — 该连接的字符串表达方式
-
-
MongoDb 类:
-
简介:该类的实例用于和数据库进行交互。要获取一个数据库
-
用法:
$m = new MongoClient(); // 连接
$db = $m->selectDB("example"); //数据库名可以用 ASCII 范围内的几乎任何字符。 但是,它们不能包括 " "、".",或者是空字符串。 名称 "system" 也是被保留的。
-
预定义变量:
-
MongoDB::PROFILING_OFF — 关闭了分析器
-
MongoDB::PROFILING_SLOW 为慢操作开启了分析器(>100 ms)。
-
MongoDB::PROFILING_ON 为所有操作开启了分析器。
-
-
类方法:
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
-
-
MongoCollection类:
-
简介:MongoDB集合
-
预定义常量:
-
MongoCollection::ASCENDING --- 索引的上升方向
-
MongoCollection::DESCENDING --- 索引的下降方向
-
-
类方法:
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
-
-
MongoCursor类:
-
简介:游标是用来遍历数据库查询的结果
-
类方法说明:
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教程学习:
-
Mongodb管理工具:
-
监控:Munin、Gangila、Cacti
-
GUI:Fang of Mongo、Futon4Mongo、Mongo3、MongoHub、Opricot、Database Master、RockMongo
-
-
MongoDB数据库,对象,集合
-
数据库:
-
一个mongodb中可以建立多个数据库。
-
MongoDB的默认数据库为"db",该数据库存储在data目录中。
-
"show dbs" 命令可以显示所有数据的列表。
-
执行 "db" 命令可以显示当前数据库对象或集合。
-
运行"use"命令,可以连接到一个指定的数据库。
-
备注:
-
数据库名称可以是任何字符,但是不能包含空字符串,点号(.),或者" "。
-
"system" 作为系统保留字符串不能作为数据库名。
-
数据库名不能包含 "$"。
-
-
-
文档:存储为bson数据,可以理解为在json的基础上添加了一些json中没有的数据类型。
-
简介:文档是mongodb中的最核心的概念,是其核心单元,可以将文档类比成关系型数据库中的每一行数据。
-
关系型数据库 -> MongoDB:
-
Table(表) -> Collection(集合)
-
Column(栏)-> Key(键)
-
Value(值)-> Value(值)
-
Records/Rows(记录/列)-> Document / Object(文档/对象)
-
-
MongoDB中常用的集中数据类型:
-
string(字符串)、integer(整型)、boolean(布尔型)、double(双精度浮点型)、null、array、object、timestamp、Internationalized Strings、Object IDs
-
-
-
集合:
-
简介:集合就是一组文档的组合,在mongodb中的集合是无模式的,也就是说集合中存储的文档的结构可以是不同的
-
合法的集合名:
-
集合名称必须以字母或下划线开头
-
集合名可以保护数字
-
集合名称不能使美元符"$"
-
集合的名字最大不能超过128个字符
-
-
-
元数据:
-
数据库的信息是存储在集合中。它们使用了系统的命名空间:dbname.system.*
-
dbname.system.namespaces --- 列出所有名字空间。
-
dbname.system.indexs --- 列出所有索引
-
dbname.system.profile --- 包含数据库概要(profile)信息。
-
dbname.system.users --- 列出所有可访问数据库的用户。
-
dbname.local.sources --- 包含复制对端(slave)的服务器信息和状态。
-
-
-
MongoDB - 连接:
-
shell命令来连接服务:
-
mongodb://username:password@localhost/dbname
-
./bin/mongo localhost:27017
-
重新连接mongodb:numactl --interleave=all bin/mongod -f conf/mongo.conf
-
-
插入数据:
-
db.collection.insert(document)
-
-
查询数据:
-
db.collection.find()
-
条件操作符:
-
(>) 大于 - $gt
-
(<) 小于 - $lt
-
(>=) 大于等于 - $gte
-
(<= ) 小于等于 - $lte
-
(!=)不等于 - $ne
-
$type --- 基于BSON类型来检索集合中匹配的结果(类型描述->类型值)
-
-
Limit、Skip、sort方法
-
limit() --- MongoDB中读取指定数量的数据记录
db.collection.find().limit()
-
skip() --- 使用skip()方法来跳过指定数量的数据
db.collection.find().skip()
-
sort() --- 通过参数(1、-1)指定排序的字段
db.collection.find().sort({key:1})
-
-
-
更新数据:
-
db.collection.update( criteria, objNew, upsert, multi )
-
criteria : update的查询条件,类似sql update查询内where后面的
-
objNew : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的(如果不更改其他字段,需要加上'$set' => {})
-
upsert : 这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
-
multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
-
-
-
删除数据:
-
db.collection.remove({})
-
-
删除集合:
-
db.collection.drop()
-
-
删除数据库:
-
db.dropDatabase()
-
-
MongoDB索引:
-
ensureIndex({}, {}) --- 方法来创建索引,第二个参数接收可选参数
db.collection.ensureIndex({KEY:1})
//1为指定按升序创建索引
//可以设置使用多个字段创建索引
-
-
MongoDB 聚合
-
aggregate() --- 聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果
db.collection.aggregate([{$group:{}}])
-
聚合的表达式:
-
$sum --- 计算总和
-
$avg --- 计算平均值
-
$min --- 获取集合中所有文档对应值得最小值
-
$max --- 获取集合中所有文档对应值得最大值
-
$push --- 在结果文档中插入值到一个数组中
-
$addToSet --- 在结果文档中插入值到一个数组中,但不创建副本
-
$first --- 根据资源文档的排序获取第一个文档数据。
-
$last --- 根据资源文档的排序获取最后一个文档数据
-
-
-
-
mongodb的安装:
三、imooc中mongoDB学习:
-
索引的学习:
-
索引的种类:
-
_id索引
-
单键索引
-
db.collection.ensureIndex({index:1});
-
-
多键索引
-
复合索引
-
db.collection.ensureIndex({index1:1, index2:1})
-
-
过期索引
-
db.collection.ensureIndex({index:1}, {expireAfterSeconds: 10})
-
存储在过期索引字段的值必须是指定的时间类型。(说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能自动删除)
-
如果指定了ISODate数组,则按照最小的时间进行删除
-
过期索引不能是复合索引
-
删除时间不是精确(说明:删除过程是后台程序每60s跑一次,而且删除也需要一些时间,所以存在误差)
-
-
全文索引
-
对字符串与字符串数组创建全文可搜索的索引
-
db.collection.ensureIndex({index: text})
-
db.collection.ensureIndex({$**: text}) //对集合中所有字段建立一个全文索引
-
使用全文索引查询:
-
db.collection.find("$text": {"$search":"aa"}) //查找全文索引字段中带有aa的
-
db.collection.find("$text": {"$search":"aa bb"}) //查找全文索引字段中带有aa或者bb的
-
db.collection.find("$text": {"$search":"aa -bb"}) //查找全文索引字段中带有aa,但不带bb的
-
db.collection.find("$text": {"$search":"\"aa\" \"bb\""}) //查找全文索引字段中既带有aa又带有bb的
-
-
使用全文索引相似度查询:
-
$meta操作符:{score: {$meta: "textScore"}}
-
写在查询条件后面可以返回结果的相似度
-
与sort一起使用,可以达到更好的实用效果
-
db.collection.find("$text": {"$search":"aa bb"}, {score: {$meta: "textScore}}).sort({score: {$meta: "textScore}})
-
-
全文索引的使用限制:
-
每次查询,只能指定一个$text查询
-
$text查询不能出现在$nor查询中
-
查询中如果包含$text,hint不再起作用
-
MongoDB全文索引还不支持中文
-
-
-
地理位置索引
-
概念:将一些点的位置存储在MongoDb中,创建索引之后,可以按照位置来查找其他点。
-
子分类:
-
2d索引:用户存储和查找平面上的点
-
2dsphere索引,用于存储和查找球面上的点
-
-
查找方法:
-
查找距离某个点一定距离内的点
-
查找包含在某个区域内的点
-
-
-
-
索引属性
-
name指定: db.collection.ensureIndex({index: text}, {name: ""});
-
unique指定(唯一性):db.collection.ensureIndex({index: text}, {unique: true/false});
-
sparse指定(稀疏性):db.collection.ensureIndex({index: text}, {sparse: true/false}); //是否为不存在的字段建立索引
-
expireAfterSeconds(是否定时删除) db.collection.ensureIndex({index: text}, {expireAfterSeconds: 10});
-
-
索引的方法:
-
获取索引:db.collection.getIndexes()
-
删除索引:db.collection.dropIndex("")
-
-
explain:查询分析
-
db.collection.find().explain()
-
-
-
MongoDB安全概览
-
最安全的是物理隔离:不现实
-
网络隔离其次
-
防火墙再隔离
-
用户名密码在最后
-
MongoDB创建用户:
-
创建语法:db.createUser()
-
创建语句:db.createUser({user:"", pwd:"", customData: "", roles: [{role: "", db: ""}]})
-
角色类型:内建类型(read, readWrite, dbAdmin, dbOwner, userAdmin)
-
-
MongoDB用户角色详解:
-
角色类型:内建类型(read, readWrite, dbAdmin, dbOwner, userAdmin)
-
集群角色(clusterAdmin,clusterManager)
-
备份角色(backup,restore)
-
其他特殊权限(DBAdminAnyDatabase)
-
-
创建用户角色权限:
-
创建语法:db.craeteRole()
-
创建语句:{_id: "", role: "", db: "", privileges: [{resource: {db: "", collection: "", actions: {"find", "update"}}}], roles: []}
-
-
-
-
MognoDB集群技术
-
多种技术:
-
-
副本级集群(Replication)
-
实现意义:数据冗余,提升读性能;架构上:中心化;实现原理上:数据镜像;维护成本:相对容易
-
-
分片技术(Shard)
-
实现意义:提升并发性能;架构上:水平化;实现原理上:数据打散分布;维护成本:相对较高
-
-
-
-
分片技术介绍:
-
概念:是将多个数据进行拆分,讲数据水平的分散到不同的服务器上
-
作用:
-
架构上:读写均衡,去中心化
-
结构上:12节点(version<=2.6)
-
硬件上:内存、硬盘容量限制
-
-
什么时候考虑分片:
-
因为mongoDB是比较费内存,当硬件、部署瓶颈
-
当查询效率或者锁表严重时
-
-
分片的目的:
-
改善单台机器数据的存储及数据吞吐性能
-
提高在大量数据下随机访问性能
-
-
分片- 成员节点介绍:
-
Shard节点:存储数据的节点(单个mongod或者副本集)
-
Config server:存储元数据,为mongos服务,将数据路由到Shard
-
mongos:接收前端请求,进行对应信息路由。
-
-
分片 - 成员节点启动参数
-
Shard节点://192.168.1.221
-
mongod --shardsvr / mongod -shardsvr -rpelSet副本集
-
mongod --shardsvr --logpath=/path/shard.log --logappend --dbpath=/path/shard --fork --port 27017
-
-
Config server: //192.168.1.221
-
mongod --configsvr
-
mongod --configsvr --logpath=/path/config.log --logappend --dbpath=/path/config --fork --port 27018
-
-
Mongos: //192.169.1.222
-
mongos -configdb <configdb server>
-
mongos --port 27017 --logappend --logpath=/path/mongos.log --configdb 127.0.0.1:27018 --fork
-
-
-
分片 - 添加分片过程
-
链接到mongos
-
Add Shards
-
单个数据实例:do.runCommand({addShard: "<hostname><:port>", maxSize: <size>, name: "<shard_name>"})
-
副本集群:do.runCommand( {addShard: "<replica_set>/<hostname><:port>", maxSize: <size>, name: "<shard_name>"})
-
如果你的mongo和shard在同一台机器上,添加分片不能使用“localhost”,建议使用IP
-
-
Enable Sharding(eabled数据库)
-
db.runcommand({enablesharding: "<shard>"})
-
-
对一个集合进行分片
-
db.runCommand({shardcollection: "<namespace>", key: "<key>"})
-
unique: "true/false" //启动对shard key的唯一性约束,保证所有分片合并起来的唯一值
-
shard key选择
-
-
-
分片 - 案例: //192.168.1.222
-
use admin
-
do.runCommand({addShard: "192.168.1.221:27017"}) //连接
-
db.runCommand({enablesharding: "shardtest"}) //连接 数据库(打开分片)
-
db.runCommand({shardcollection: "shardtest.userid", key: "{userid: 1}"}) //连接集合(片健可以用复合字段组合)
-
多个shard,则执行步骤2
-
use config
-
db.shards.find() //查询所有的分片shard
-
-
分片 - 测试
-
查看集合的状态:use shardtest; db.userid.stat();
-
查看分片状态:db.printShardingStatus();
-
-
分片 - shard key
-
分片片健概念:集合里面选一个健,用该健的值作为数据拆分的依据
-
Chunk: Mongodb分片后,存储数据的单元块,默认大小:64MB
-
-
分片 - chunk拆分
-
数据库(chunk)拆分:记录每个快中插入多少数据,一旦达到某个阀值,执行检查是否需要拆分块,需要则更新config服务器上这个块的元信息
-
-
分片 - balancing
-
数据块平衡:均衡器负责数据的迁移,会周期性的检查分片是否存在不均衡,如果存在则会进行块的迁移
-
注意:均衡器进行均衡的条件是块数量的多少,而不是块的大小
-
-
分片 - 哈希分片
-
分片过程中利用哈希索引作为分片的单个健
-
好处:哈希分片的片健只能使用一个字段,哈希片健最大的好处就是保证数据在各个节点分布基本均匀
-
shardcollection ==> {user_id: hashed}
-
-
分片 - 如果选择合适片健
-
选择片健的好坏很大程度上影响集群的性能,容量和功能
-
考虑因素一:
-
数据块的大小(影响:片健相同导致数据块不拆分,容易形成大的数据块,导致数据不均)
-
数据写均匀分布(影响:单调递增的'_id'或时间戳作为片健,这样将会导致你一直往最后一个副本集中添加数据)
-
-
-
分片 - 请求查询机制:
-
Routed Request:路由查询
-
Scatter Gather Request:分散聚合查询
-
Distributed Merge Sort Req:分布式合并排序查询
-
-
分片 - 手动分片
-
作用:为了减少自动平衡过程带来的IO等资源消耗
-
前提:
-
关闭自动平衡,关闭auto balance
-
充分了解数据,并对数据进行预先划分
-
-
步骤:
-
关闭自动平衡
-
关闭方式:sh.stopBalancer()
-
启动方式:sh.startbalancer()
-
查看平衡器状态:Currently enabled: no
-
-
分片切割
-
手动移动分割块
-
-
-
分片 - 部署场景(考虑因素)
-
预估数据增长量
-
预估集群的访问量
-
预估投入成本(硬件、人员维护等)
-
-
-