Angel_Kittyphp
发表于小樱的经验随笔订阅html
1.7Kjava
本文首发于imooc:https://www.imooc.com/article/75436mysql
MongoDB
是一个介于关系数据库和非关系数据库之间的开源产品,是最接近于关系型数据库的 NoSQL
数据库。它在轻量级JSON
交换基础之上进行了扩展,即称为 BSON
的方式来描述其无结构化的数据类型。尽管如此它一样能够存储较为复杂的数据类型。它和上一篇文章讲到的Redis有殊途同归之妙。虽然二者均为 NoSQL
,可是 MongoDB
相对于 Redis
而言,MongoDB
更像是传统的数据库。早些年咱们是先有了 Relation Database
(关系型数据库),而后出现了不少很复杂的query
,里面用到了不少嵌套,不少 join
操做。因此在设计数据库的时候,咱们也考虑到了如何应用他们的关系,使得写 query
可使 database
效率达到最高。后来人们发现,不是每一个系统,都须要如此复杂的关系型数据库。有些简单的网站,好比博客,好比社交网站,彻底能够斩断数据库之间的一切关系。这样作带来的好处是,设计数据库变得更加简单,写 query
也变得更加简单。而后,query
消耗的时间可能也会变少。由于 query
简单了,少了许多消耗资源的 join
操做,速度天然会上去。正如所说的, query
简单了,颇有之前 MySQL
能够找到的东西,如今关系没了,经过 Mongo
找不到了。咱们只能将几组数据都抓到本地,而后在本地作 join
,因此在这点上可能会消耗不少资源。这里咱们能够发现。如何选择数据库,彻底取决于你所须要处理的数据的模型,即 Data Model
。若是它们之间,关系错综复杂,千丝万缕,这个时候 MySQL
必定是首选。若是他们的关系并非那么密切,那么, NoSQL
将会是利器。程序员
MongoDB
和 Redis
同样均为 key-value
存储系统,它具备如下特色:正则表达式
Python
, PHP
, Ruby
, Java
, C
, C#
, Javascript
,Perl
及 C++
语言的驱动程序,社区中也提供了对 Erlang
及 .NET
等平台的驱动程序。BSON
(一种 JSON
的扩展)。像 MySQL
同样, MongoDB
提供了丰富的远远超出了简单的键值存储中提供的功能和功能。 MongoDB
具备查询语言,功能强大的辅助索引(包括文本搜索和地理空间),数据分析功能强大的聚合框架等。相比使用关系数据库而言,使用MongoDB
,您还可使用以下表所示的这些功能,跨越更多样化的数据类型和数据规模。sql
|
MySQLmongodb |
MongoDBshell |
---|---|---|
丰富的数据模型数据库 |
否 |
是 |
动态 Schema |
否 |
是 |
数据类型 |
是 |
是 |
数据本地化 |
否 |
是 |
字段更新 |
是 |
是 |
易于编程 |
否 |
是 |
复琐事务 |
是 |
否 |
审计 |
是 |
是 |
自动分片 |
否 |
是 |
MySQL
中的许多概念在 MongoDB
中具备相近的类比。本表概述了每一个系统中的一些常见概念。
MySQL |
MongoDB |
---|---|
表 |
集合 |
行 |
文档 |
列 |
字段 |
joins |
嵌入文档或者连接 |
MongoDB
的主要目标是在 key-value
(键/值)存储方式(提供了高性能和高度伸缩性)以及传统的 RDBMS
系统(丰富的功能)架起一座桥梁,集二者的优点于一身。 MongoDB
适用范围以下:
Mongo
很是适合实时的插入,更新与查询,并具有网站实时数据存储所需的复制及高度伸缩性。Mongo
也适合做为信息基础设施的缓存层。在系统重启以后,由 Mongo
搭建的持久化缓存层能够避免下层的数据源过载。Mongo
很是适合由数十或数百台服务器组成的数据库。 Mongo
的路线图中已经包含对 MapReduce
引擎的内置支持。Mongo
的 BSON
数据格式很是适合文档化格式的存储及查询。MongoDB
固然也会有如下场景的限制:
BI
数据库会对产生高度优化的查询方式。对于此类应用,数据仓库多是更合适的选择。SQL
的问题。一、建立一个 mongodb-org-3.6.repo
文件
vi /etc/yum.repos.d/mongodb-org-3.6.repo
在文件中加入以下内容:
[mongodb-org-3.6] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
退出编辑模式,直接输入以下命令安装便可:
sudo yum install -y mongodb-org
若要安装特定版本的 MongoDB
,请分别指定每一个组件包并将版本号附加到包名称,以下所示:
sudo yum install -y mongodb-org-3.6.3 mongodb-org-server-3.6.3 mongodb-org-shell-3.6.3 mongodb-org-mongos-3.6.3 mongodb-org-tools-3.6.3
你能够指定任何可用的 MongoDB
版本。然而, yum
会在新版本可用时升级软件包。为防止意外升级,请钉住包装。要固定软件包,请将如下 exclude
指令添加到 /etc/yum.conf
文件中:
exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
咱们直接运行以下命令:
mongod -repair
看到以下字样,说明咱们安装成功!
咱们建立一个 db
,并查看下 mongo
的安装位置:
mkdir db whereis mongod
安装完成后启动 mongodb
,并查看下 mongob
启动状态:
systemctl start mongod.service systemctl status mongod.service
若是出现以下字样,说明启动成功!
成功启动 MongoDB
后,新建一个命令行输入 mongo
进行登陆操做,便可进行数据库的一些操做了。
mongo
MongoDB
的数据类型大体有下列几种:
数据类型 |
描述 |
---|---|
String |
字符串。存储数据经常使用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer |
整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean |
布尔值。用于存储布尔值(真/假)。 |
Double |
双精度浮点值。用于存储浮点值。 |
Min/Max keys |
将一个值与 BSON (二进制的 JSON)元素的最低值和最高值相对比。 |
Arrays |
用于将数组或列表或多个值存储为一个键。 |
Timestamp |
时间戳。记录文档修改或添加的具体时间。 |
Object |
用于内嵌文档。 |
Null |
用于建立空值。 |
Symbol |
符号。该数据类型基本上等同于字符串类型,但不一样的是,它通常用于采用特殊符号类型的语言。 |
Date |
日期时间。用 UNIX 时间格式来存储当前日期或时间。你能够指定本身的日期时间:建立 Date 对象,传入年月日信息。 |
Object ID |
对象 ID。用于建立文档的 ID。 |
Binary Data |
二进制数据。用于存储二进制数据。 |
Code |
代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression |
正则表达式类型。用于存储正则表达式。 |
下面咱们将介绍一些 MongoDB
的经常使用命令!
一、建立数据库
use 数据库名称
:建立一个新的数据库。注意:若是该数据库不存在,则建立,若是该数据库存在,则是切换 若是建立了数据库,没有任何的操做,则会自动删除该数据库
example:
> use stu switched to db stu
二、查看数据库
show dbs
:查看当前有多少个数据库
example:
> show dbs admin 0.000GB config 0.000GB local 0.000GB
三、建立集合
db.集合名.insert({})
:向集合里面,添加文档。{}
里面是 json
的文档。注意: mongodb
里面的集合是隐式建立,就是无需建立,直接使用。 db
表示显示当前所在的数据库。
example:
> db.php.insert({"name":"xiaoming","age":20,"email":"xiaoming@gmail.com"}) WriteResult({ "nInserted" : 1 }) > db.php.insert({"name":"xiaohong","age":18,"email":"xiaohong@gmail.com"}) WriteResult({ "nInserted" : 1 })
四、查看集合
show tables
:查看当前数据库中的集合
example:
> show tables php
五、查询集合里面的文档
db.集合名.find()
:查询当前数据库中该集合下的全部文档
example:
> db.php.find() { "_id" : ObjectId("5b9318ac487b851e62879578"), "name" : "xiaoming", "age" : 20, "email" : "xiaoming@gmail.com" } { "_id" : ObjectId("5b9319a2487b851e62879579"), "name" : "xiaohong", "age" : 18, "email" : "xiaohong@gmail.com" }
db.集合名.find
:查询当前数据库中该集合下的第一个文档
example:
> db.php.find function (query, fields, limit, skip, batchSize, options) { var cursor = new DBQuery(this._mongo, this._db, this, this._fullName, this._massageObject(query), fields, limit, skip, batchSize, options || this.getQueryOptions()); { const session = this.getDB().getSession(); const readPreference = session._serverSession.client.getReadPreference(session); if (readPreference !== null) { cursor.readPref(readPreference.mode, readPreference.tags); } const readConcern = session._serverSession.client.getReadConcern(session); if (readConcern !== null) { cursor.readConcern(readConcern.level); } } return cursor; }
六、删除集合
db.集合名.drop()
:删除当前数据库中的集合
example:
> db.php.drop() true
七、删除数据库
db.dropDatabase()
:删除当前的数据库
> db.dropDatabase() { "dropped" : "stu", "ok" : 1 }
八、帮助命令
help
:全局帮助命令
> help db.help() help on db methods db.mycoll.help() help on collection methods sh.help() sharding helpers rs.help() replica set helpers help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile entries with time >= 1ms show logs show the accessible logger names show log [name] prints out the last segment of log in memory, 'global' is default use set current database db.foo.find() list objects in collection foo db.foo.find( { a : 1 } ) list objects in foo where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to display on shell exit quit the mongo shell
db.help()
:数据库相关的帮助命令
example:
> db.help() DB methods: db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [just calls db.runCommand(...)] db.aggregate([pipeline], {options}) - performs a collectionless aggregation on this database; returns a cursor db.auth(username, password) db.cloneDatabase(fromhost) db.commandHelp(name) returns the help for the command db.copyDatabase(fromdb, todb, fromhost) db.createCollection(name, {size: ..., capped: ..., max: ...}) db.createView(name, viewOn, [{$operator: {...}}, ...], {viewOptions}) db.createUser(userDocument) db.currentOp() displays currently executing operations in the db db.dropDatabase() db.eval() - deprecated db.fsyncLock() flush data to disk and lock server for backups db.fsyncUnlock() unlocks server following a db.fsyncLock() db.getCollection(cname) same as db['cname'] or db.cname db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections db.getCollectionNames() db.getLastError() - just returns the err msg string db.getLastErrorObj() - return full status object db.getLogComponents() db.getMongo() get the server connection object db.getMongo().setSlaveOk() allow queries on a replication slave server db.getName() db.getPrevError() db.getProfilingLevel() - deprecated db.getProfilingStatus() - returns if profiling is on and slow threshold db.getReplicationInfo() db.getSiblingDB(name) get the db at the same server as this one db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set db.hostInfo() get details about the server's host db.isMaster() check replica primary status db.killOp(opid) kills the current operation in the db db.listCommands() lists all the db commands db.loadServerScripts() loads all the scripts in db.system.js db.logout() db.printCollectionStats() db.printReplicationInfo() db.printShardingStatus() db.printSlaveReplicationInfo() db.dropUser(username) db.repairDatabase() db.resetError() db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into {cmdObj: 1} db.serverStatus() db.setLogLevel(level,) db.setProfilingLevel(level,slowms) 0=off 1=slow 2=all db.setWriteConcern() - sets the write concern for writes to the db db.unsetWriteConcern() - unsets the write concern for writes to the db db.setVerboseShell(flag) display extra information in shell output db.shutdownServer() db.stats() db.version() current version of the server
db.集合名.help()
:集合相关的帮助命令
example:
> db.php.help() DBCollection help db.php.find().help() - show DBCursor help db.php.bulkWrite( operations, ) - bulk execute write operations, optional parameters are: w, wtimeout, j db.php.count( query = {}, ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS db.php.copyTo(newColl) - duplicates collection by copying all documents to newColl; no indexes are copied. db.php.convertToCapped(maxBytes) - calls {convertToCapped:'php', size:maxBytes}} command db.php.createIndex(keypattern[,options]) db.php.createIndexes([keypatterns], ) db.php.dataSize() db.php.deleteOne( filter, ) - delete first matching document, optional parameters are: w, wtimeout, j db.php.deleteMany( filter, ) - delete all matching documents, optional parameters are: w, wtimeout, j db.php.distinct( key, query, ) - e.g. db.php.distinct( 'x' ), optional parameters are: maxTimeMS db.php.drop() drop the collection db.php.dropIndex(index) - e.g. db.php.dropIndex( "indexName" ) or db.php.dropIndex( { "indexKey" : 1 } ) db.php.dropIndexes() db.php.ensureIndex(keypattern[,options]) - DEPRECATED, use createIndex() instead db.php.explain().help() - show explain help db.php.reIndex() db.php.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return. e.g. db.php.find( {x:77} , {name:1, x:1} ) db.php.find(...).count() db.php.find(...).limit(n) db.php.find(...).skip(n) db.php.find(...).sort(...) db.php.findOne([query], [fields], [options], [readConcern]) db.php.findOneAndDelete( filter, ) - delete first matching document, optional parameters are: projection, sort, maxTimeMS db.php.findOneAndReplace( filter, replacement, ) - replace first matching document, optional parameters are: projection, sort, maxTimeMS, upsert, returnNewDocument db.php.findOneAndUpdate( filter, update, ) - update first matching document, optional parameters are: projection, sort, maxTimeMS, upsert, returnNewDocument db.php.getDB() get DB object associated with collection db.php.getPlanCache() get query plan cache associated with collection db.php.getIndexes() db.php.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) db.php.insert(obj) db.php.insertOne( obj, ) - insert a document, optional parameters are: w, wtimeout, j db.php.insertMany( [objects], ) - insert multiple documents, optional parameters are: w, wtimeout, j db.php.mapReduce( mapFunction , reduceFunction , ) db.php.aggregate( [pipeline], ) - performs an aggregation on a collection; returns a cursor db.php.remove(query) db.php.replaceOne( filter, replacement, ) - replace the first matching document, optional parameters are: upsert, w, wtimeout, j db.php.renameCollection( newName , ) renames the collection. db.php.runCommand( name , ) runs a db command with the given name where the first param is the collection name db.php.save(obj) db.php.stats({scale: N, indexDetails: true/false, indexDetailsKey: , indexDetailsName: }) db.php.storageSize() - includes free space allocated to this collection db.php.totalIndexSize() - size in bytes of all the indexes db.php.totalSize() - storage allocated for all data and indexes db.php.update( query, object[, upsert_bool, multi_bool] ) - instead of two flags, you can pass an object with fields: upsert, multi db.php.updateOne( filter, update, ) - update the first matching document, optional parameters are: upsert, w, wtimeout, j db.php.updateMany( filter, update, ) - update all matching documents, optional parameters are: upsert, w, wtimeout, j db.php.validate( ) - SLOW db.php.getShardVersion() - only for use with sharding db.php.getShardDistribution() - prints statistics about data distribution in the cluster db.php.getSplitKeysForChunks( ) - calculates split points over all chunks and returns splitter function db.php.getWriteConcern() - returns the write concern used for any operations on this collection, inherited from server/db if set db.php.setWriteConcern( ) - sets the write concern for writes to the collection db.php.unsetWriteConcern( ) - unsets the write concern for writes to the collection db.php.latencyStats() - display operation latency histograms for this collection
一、添加文档
db.集合名.insert({k1:v1,k2:v2...})
:向当前数据库的该集合下添加文档
咱们在添加文档的时候有以下注意点:
a) 文档就是键值对,数据类型是 BSON
格式,支持的值更加丰富。 BSON
是 JSON
的扩展,新增了诸如日期,浮点等 JSON
不支持的数据类型。
b) 在添加的文档里面,都有一个 '_id'
的键,值为对象类型 ObjectID
,在这里,咱们解释下 ObjectID
类型:
每一个文档都有一个 _id
字段,而且同一集合中的 _id
值惟一,该字段能够是任意类型的数据,默认是一个 ObjectID
对象。 ObjectID
对象数据组成:时间戳|机器码|PID|计数器 _id
的键值咱们能够本身输入,可是不能重复,但要注意的一点是在插入数据的时候,若是 _id
的值重复则会报错
c) 可使用 js
代码来完成批量插入文档
example:
> for(var i=1;i<=10;i++){ ... db.php.insert({'name':'xiaobai'+i,'age':i,'email':'xiaobai'+i+'@gmail.com'}) ... } WriteResult({ "nInserted" : 1 }) > db.php.find() { "_id" : ObjectId("5b931b74a39e4f4842ba36b3"), "name" : "xiaoming", "age" : 20, "email" : "xiaoming@gmail.com" } { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaohong", "age" : 18, "email" : "xiaohong@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36b5"), "name" : "xiaobai1", "age" : 1, "email" : "xiaobai1@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36b6"), "name" : "xiaobai2", "age" : 2, "email" : "xiaobai2@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36b7"), "name" : "xiaobai3", "age" : 3, "email" : "xiaobai3@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36b8"), "name" : "xiaobai4", "age" : 4, "email" : "xiaobai4@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36b9"), "name" : "xiaobai5", "age" : 5, "email" : "xiaobai5@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "name" : "xiaobai6", "age" : 6, "email" : "xiaobai6@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "name" : "xiaobai7", "age" : 7, "email" : "xiaobai7@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bc"), "name" : "xiaobai8", "age" : 8, "email" : "xiaobai8@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "name" : "xiaobai9", "age" : 9, "email" : "xiaobai9@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36be"), "name" : "xiaobai10", "age" : 10, "email" : "xiaobai10@gmail.com" }
二、删除文档
db.集合名.remove{(条件)}
:删除当前数据库下指定集合中知足条件的文档(不写条件则删除全部的文档)
example:
> db.php.remove({age:20}) WriteResult({ "nRemoved" : 1 }) > db.php.remove({age:{'$lt':6}}) WriteResult({ "nRemoved" : 5 }) > db.php.find() { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaohong", "age" : 18, "email" : "xiaohong@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "name" : "xiaobai6", "age" : 6, "email" : "xiaobai6@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "name" : "xiaobai7", "age" : 7, "email" : "xiaobai7@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bc"), "name" : "xiaobai8", "age" : 8, "email" : "xiaobai8@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "name" : "xiaobai9", "age" : 9, "email" : "xiaobai9@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36be"), "name" : "xiaobai10", "age" : 10, "email" : "xiaobai10@gmail.com" }
这里咱们在删除 php
集合中年龄小于6的文档时,咱们使用了操做符来完成。
比较运算符
操做符 |
效果 |
---|---|
$gt |
大于 |
$lt |
小于 |
$gte |
大于等于 |
$lte |
小于等于 |
$exists |
存在与否 |
$in |
包含 |
$ne |
不等于 |
$nin |
不包含 |
逻辑运算符
操做符 |
效果 |
---|---|
$exists |
存在与否 |
$or |
或者 |
$and |
而且 |
$not |
不存在 |
$mod |
求模 |
$where |
位置 |
特别的 $exists: true 表示字段存在
排序 sort
操做 |
效果 |
---|---|
$asc |
升序 |
$desc |
降序 |
三、更新文档
更新文档有两种方式进行修改
方法1、直接修改
db.集合名.update({条件},{新的文档})
:修改当前数据库下指定集合中知足条件的文档信息
example:
> db.php.find() { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaohong", "age" : 18, "email" : "xiaohong@gmail.com" } > db.php.update({age:18},{name:'xiaobai5'}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.php.find() { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaobai5" }
db.集合.update(条件,新文档,是否新增,是否修改多条)
:修改当前数据库下指定集合中知足条件的文档信息
example:
> db.php.update({age:10},{name:'xiaoli'},true,true) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 9, "errmsg" : "multi update only works with $ operators" } })
方法2、使用修改器
example:
咱们要修改 age=6
的文档名称为 xiaosan
,而且其余键值不能丢失
咱们可使用修改器
$inc
:加上一个数字$set
:修改某一个字段,若是该字段不存在就增这个字段语法:db.集合名.update({条件},{修改器名称:{修改的键:修改的新值}})
> db.php.update({age:6},{'$set':{name:'xiaosan'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
那若是咱们要修改 age=10
的文档的年龄增长十岁,咱们能够这样作:
> db.php.update({age:10},{$inc:{age:10}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
四、查询文档
语法: db.集合名.find({条件})
example:
取出 php
集合里面的第一个文档
> db.php.findOne() { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaobai5" }
取出 php
集合里面 age=6
的文档
> db.php.find({age:6}) { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "name" : "xiaosan", "age" : 6, "email" : "xiaobai6@gmail.com" }
取出 php
集合里面 age>8
的文档
> db.php.find({age:{'$gt':8}}) { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "name" : "xiaobai9", "age" : 9, "email" : "xiaobai9@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36be"), "name" : "xiaobai10", "age" : 20, "email" : "xiaobai10@gmail.com" }
取出 php
集合里面的文档,只显示 name
键
> db.php.find({},{age:1})//1表示只显示age键值 { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4") } { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "age" : 6 } { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "age" : 7 } { "_id" : ObjectId("5b931dfba39e4f4842ba36bc"), "age" : 8 } { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "age" : 9 } { "_id" : ObjectId("5b931dfba39e4f4842ba36be"), "age" : 20 } > db.php.find({},{age:0})//1表示除了显示age键值,其余的都显示 { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaobai5" } { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "name" : "xiaosan", "email" : "xiaobai6@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "name" : "xiaobai7", "email" : "xiaobai7@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bc"), "name" : "xiaobai8", "email" : "xiaobai8@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "name" : "xiaobai9", "email" : "xiaobai9@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36be"), "name" : "xiaobai10", "email" : "xiaobai10@gmail.com" }
根据年龄的(降序|升序)来显示文档
db.集合名.find().sort({age:1})根据年龄升序 db.集合名.find().sort({age:0})根据年龄降序
显示 php
集合中的前三个文档
> db.php.find().limit(3) { "_id" : ObjectId("5b931b7ca39e4f4842ba36b4"), "name" : "xiaobai5" } { "_id" : ObjectId("5b931dfba39e4f4842ba36ba"), "name" : "xiaosan", "age" : 6, "email" : "xiaobai6@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "name" : "xiaobai7", "age" : 7, "email" : "xiaobai7@gmail.com" }
显示 php
集合中的第三个文档到第五个文档
> db.php.find().skip(2).limit(3) { "_id" : ObjectId("5b931dfba39e4f4842ba36bb"), "name" : "xiaobai7", "age" : 7, "email" : "xiaobai7@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bc"), "name" : "xiaobai8", "age" : 8, "email" : "xiaobai8@gmail.com" } { "_id" : ObjectId("5b931dfba39e4f4842ba36bd"), "name" : "xiaobai9", "age" : 9, "email" : "xiaobai9@gmail.com" }
统计 php
集合中文档的个数
db.集合名.count():返回集合中有多少个文档
一、权限概述
在 MongoDB
里面的用户是属于数据库的,每一个数据库都有本身的管理员。管理员登陆后,只能操做所属的数据库。注意:在 admin
的数据库中建立的用户是超级管理员,登录后能够操做任何的数据库
二、建立用户
(1) 选择数据库
use 数据库的名称
(2) 添加用户
db.createUser(用户名,密码,是否只读)
第三个参数"是否只读"默认是 false
,建立的用户能够执行读写,若是是 true
,则建立的用户只能查询,不能修改。
注意点:在建立用户以前,必须先建立一个超级管理员
example:
> use admin switched to db admin > db.createUser({user:'user', ... pwd:'passwd', ... roles:[ ... {role:'userAdminAnyDatabase', db:'admin'} ... ] ... }) Successfully added user: { "user" : "user", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
三、验证权限(用户登陆)
在添加完成管理员以后,咱们作以下操做:
(1) 若是你是安装成windows服务的方式安装的,则卸载服务,在安装时添加一个 -auth
选项,auth
表示要开启权限认证
(2) 若是你是直接启动的方式,则中止服务,从新启动,在启动时也要添加 --auth
选项,auth
表示要开启权限认证
若是没有经过权限验证,直接操做数据库,则报以下错误提示:
error: { "$err" : "unauthorized db:test lock type:-1 client:127.0.0.1", "code" : 10057 }
如何经过权限验证
db.auth
(用户名,密码)四、删除用户和修改密码
注意:建立的用户名和密码是存储在各自数据库里面的 system.users
集合里面的。想要删除用户,则直接删除 system.users
集合里面的文档便可
五、总结说明
a) 非 admin
数据库的用户不能使用数据库命令,好比 show dbs
等
(b) admin
数据库中的用户被视为超级用户(即管理员),在认证以后,管理员能够读写全部数据库,执行特定的管理命令。
(c) 在开启安全检查以前,必定要至少有个管理员帐户。
(d) 数据库的用户帐号以文档的形式存储在 system.users
集合里面。能够在 system.users
集合中删除用户帐号文档,就能够删除用户。
一、普通单列索引
咱们用以下代码来测试:
for(var i=0;i<200000;i++){ db.java.insert({name:'xiao'+i,age:i}) }
第1、咱们先检验一下查询性能
var start=new Date() db.java.find({name:'xiao156789'}) var end=new Date() end-start 17510
第2、为 name
建立索引
> db.java.ensureIndex({name:1}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
第3、再执行第一部分代码能够看出有数量级的性能提高
语法:db.集合名.ensureIndex({键名:1})
:1是升序,-1是降序
二、多列索引(复合索引)
建立多列索引 语法:db.集合名.ensureIndex({field1:1/-1,field2:1/-1})
对 name
和 age
创建一个复合索引,可使用 db.集合名.getIndexes()
查看建立的索引状况
三、子文档索引
语法: db.集合名.ensureIndex({field.subfield:1/-1})
以下文档能够创建子文档索引
{name:'诺基亚手机1',price:12.34,spc:{weight:100,area:'纽约'}} {name:'诺基亚手机2',price:42.34,spc:{weight:200,area:'伦敦'}}
好比要查询 weight=100
的文档
db.goods.find({'spc.weight':100})
根据当前案例,咱们创建子文档索引
db.net.ensureIndex({'spc.w':1})
四、惟一索引
语法: db.集合名.ensureIndex({name:-1},{unique:true})
五、查看索引
(1) 查看当前索引状态: db.集合名.getIndexes()
(2) 详情查看本次查询使用哪一个索引和查询数据的状态信息: db.集合名.find({name:''xiao}).explain()
六、删除索引
删除单个索引: db.集合名.dropIndex({filed:1/-1})
删除全部索引: db.集合名.dropIndexes()
七、重建索引
一个表通过不少次修改后,致使表的文件产生空洞,索引文件也如此,能够经过索引的重建,减小索引文件碎片,并提升索引的效率,相似 mysql
中的 optimize table
。
mysql
里面使用 optimize table
语法: optimize table
表名
语法: db.集合名.reIndex()
八、索引使用注意事项
(1) 建立索引的时候,注意1是正序建立索引,-1是倒序建立索引
(2) 索引的建立在提升查询性能的同时会影响插入性能,对于常常查询少插入
(3) 复合索引要注意索引的前后顺序
(4) 每一个键全创建索引不必定就能提升性能,索引不是万能的。
(5) 在作排序工做的时候若是是超大数据量也能够考虑加上索引用来提升排序的性能。
利用mongoexport
注意:在使用用户名和密码是超级管理员的时候,若是端口是默认的能够不使用-port来指定端口
(2) 导入数据
例如:导入json
./bin/mongoimport -h -port 端口号 -d test -c goods -file ./goodsall.json
导入csv
./bin/mongoimport -h -port 端口号 -d test -c goods -type csv -f goods.id,goods.name -file ./goodsall.csv ./bin/mongoimport -h -port 端口号 -d test -c goods -type csv -f -headline -f goods.id,goods.name -file ./goodsall.csv
主从复制是一个简单的数据库同步备份的集群技术,至少两台数据库服务器,能够分别设置主服务器和从服务器,对主服务器的任何操做都会同步到从服务器上。
实现的注意点
一、在数据库集群中要明确的知道谁是主服务器,主服务器只有一台
二、从服务器要知道本身的数据源 也就是对应的主服务是谁
三、--master用来肯定主服务器 --slave和--source来控制从服务器
配置步骤
(1) 启动主服务器
(2) 启动从服务器
(3) 客户端登陆到主服务器
添加一些数据,测试是否同步到从服务器,在主服务器里面,添加了一些文档:
第一步,客户端登陆到主服务器,添加一些文档
第二步,登陆到从服务器,查看是否有数据,若是有数据,则成功了!
一、安装扩展
注意:扩展文件,下载合适的php_mongodb.dll文件
1) php的版本
2) 是不是线程安全的thread safe(ts)
3) 是vc几的
4) php是32位的仍是64位的
步骤
1) 把对应的扩展,拷贝到PHP的安装目录里面的ext目录下面,注意:拷贝后更名为php_mongo.dll,方便管理
2) 打开php.ini文件,引入该扩展
extension=php_mongo.dll
3) 重启Apache,使用phpinfo()函数测试
二、入门使用
1) 链接mongodb服务器
$m=new MongoClient("mongodb://root:root@localhost:8888/admin"); $db=$m->selectDb("stu");//选择数据库
2) 增删改查用法
增删改查
注意,在命令行里面的"." 变成了"->","{}"变成了数组
a) 添加一个文档
$db->php->insert(array('name'=>'李元霸','age'=>12));
b) 查询文档
$data=$db->php->find();
查询年龄等于9的文档:
$data=$db->php->find(array('age'=>9));
查询年龄大于9的文档:
//db.php.find({age:{'$gt':9}}) $data=$db->php->find(array('age'=>array('$gt':9)));
根据年龄降序显示:
$data=$db->php->find()->sort(array('age'=>1)); foreach($data as $v){ echo $v['name'].'----'.$v['age'].'--'.$v['email'].''; }
c) 修改文档,咱们直接使用修改器来完成
把年龄等于8的名称更名为李白:
//db.php.update({age:8},{'$set':{'name':'李白'}}) $db->php->update(array('age'=>8),array('$set'=>array('name'=>'李白'));
d) 删除文档
好比删除年龄等于10的文档:
//db.php.remove({age:10}) $db->php->remove(array('age'=>10)) $data=$db->php->find() foreach($data as $v){ echo $v['name'].'----'.$v['age'].'--'.$v['email'].''; }
3) 把mysql表里面的数据存储到mongodb里面
selectDb("stu");//选择数据库 //从mysql里面取出数据 $conn=mysql_connect('localhost','root','root'); mysql_query('use shop'); mysql_query('set names utf8'); $sql="select * from goods"; $res=mysql_query($sql); while($row=mysql_fetch_assoc($res)){ $db->goods->insert($row); } echo 'ok';
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一块儿分享。
发表于 2018-09-21