MongoDB
介绍
定义
-
MongoDB是一个开源、高性能、无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。MongoDB是是最像关系型数据库(MySQL)的非关系型数据库
-
它支持的数据结构非常松散,是一种类似于 JSON 的 格式叫BSON,所以它既可以存储比较复杂的数据类型,又相当的灵活
-
MongoDB中的记录是一个文档,它是一个由字段和值对**(field:value)**组成的数据结构。MongoDB文档类似于JSON对象,即一个文档认为就是一个对象。字段的数据类型是字符型,它的值除了使用基本的一些类型外,还可以包括其他文档、普通数组和文档数组
特点
-
高性能: MongoDB提供高性能的数据持久性。特别是, 对嵌入式数据模型的支持减少了数据库系统上的I/O活动。 索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键
-
高可用性: MongoDB的复制工具称为副本集(replica set),它可提供自动故障转移和数据冗余,可达99.999%高可用
-
高扩展性: MongoDB提供了水平可扩展性作为其核心功能的一部分。 分片将数据分布在一组集群的机器上。(海量数据存储,服务能力水平扩展) 从3.4开始,MongoDB支持基于片键创建数据区域。在一个平衡的集群中,MongoDB将一个区域所覆盖的读写只定向到该区域内的那些片。
-
丰富的查询支持: MongoDB支持丰富的查询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等。
-
存储量大:比较适合存储大量的没有规则、无序的数据。未经过处理的数据。单表实现存储PB级别的数据(1PB = 1024TB)
-
储存和读写速度快
-
其他特点:如无模式(动态模式)、灵活的文档模型
数据类型
数据类型 | 描述 | 举例 |
---|---|---|
字符串 | utf8字符串都可以表示为字符串类型的数据 | {“x”:“foobar”} |
对象id | 对象id是文档的12字节的唯一ID | {“X”:Objectid()} |
布尔值 | 真或者假:true或者false | {“x”:true} |
数组 | 值的集合或者列表都可以表示成数组 | {“x”:[“a”,“b”,“c”]} |
整数 | (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) | {“age”:18} |
null | 表示空值或者未定义的对象 | {“x”:null} |
undefined | 文档中也可以使用未定义类型 | {“x”:undefined} |
MySQL&MongoDB
MySQL术语/概念 | MongoDB术语/概念 | 解释、说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
colnum | field | 数据字段/域 |
index | index | 索引 |
table join | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设为主键 |
MongoDB应用场景
- 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能
- 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问
- 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将 订单所有的变更读取出来
- 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析
- 视频直播,使用 MongoDB 存储用户信息、点赞互动信息等
安装与配置
安装方式
- yum:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
- 源码安装:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-linux/
源码安装
安装(提前下载源码包)
[root@mongodb ~]# cd /root/soft
[root@mongodb soft]# rz
[root@mongodb soft]# tar -xzf mongodb-linux-x86_64-rhel62-3.6.5.tgz
[root@mongodb soft]# mv mongodb-linux-x86_64-rhel62-3.6.5 /usr/local/mongodb
创建数据和日志目录
[root@mongodb soft]# cd /usr/local/mongodb/
[root@mongodb mongodb]# mkdir logs
后台启动
[root@mongodb mongodb]# ./bin/mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/logs/log.txt --fork
about to fork child process, waiting until server is ready for connections.
forked process: 1967
child process started successfully, parent exiting
[root@mongodb mongodb]# ss -tnalp|grep mongod
添加到环境变量
[root@mongodb mongodb]# echo 'PATH=/usr/local/mongodb/bin:$PATH' >> /etc/profile
[root@mongodb mongodb]# source /etc/profile
简单使用
[root@mongodb mongodb]# mongo
> 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 <db_name> 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
> exit
bye
MongoDB使用
选择切换数据库:use articledb
插入数据:db.comment.insert({bson数据})
查询所有数据:db.comment.find();
条件查询数据:db.comment.find({条件})
查询符合条件的第一条记录:db.comment.findOne({条件})
查询符合条件的前几条记录:db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:db.comment.find({条件}).skip(条数)
修改数据:db.comment.update({条件},{修改后的数据}) 或db.comment.update({条件},{$set:
{要修改部分的字段:数据})
修改数据并自增某字段值:db.comment.update({条件},{$inc:{自增的字段:步进值}})
删除数据:db.comment.remove({条件})
统计查询:db.comment.count({条件})
模糊查询:db.comment.find({字段名:/正则表达式/})
条件比较运算:db.comment.find({字段名:{$gt:值}})
包含查询:db.comment.find({字段名:{KaTeX parse error: Expected 'EOF', got '}' at position 11: in:[值1,值2]}̲})或db.comment.f…nin:
[值1,值2]}})
条件连接查询:db.comment.find({KaTeX parse error: Expected 'EOF', got '}' at position 18: …d:[{条件1},{条件2}]}̲)或db.comment.fi…or:[{条件
1},{条件2}]})
数据库操作
- use :选择数据库,如果数据库不存在就创建
> use mydb
switched to db mydb
- show :查看所有数据库
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
#说明
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
- db :查看当前所在数据库
> db
mydb
集合操作
- db.createCollection(“集合名”) :创建集合
> db.createCollection('mycollection')
{ "ok" : 1 }
- show collections; :查看当前所在库的所有集合
> show collections;
mycollection
> show tables;
mycollection
- db.集合名.drop() :删除集合
> db.mycollection.drop()
true
文档操作
- db.集合名称.insert(bson格式数据):创建集合
创建普通集合
> db.goods.insert({name:'huawei01',price:1000,weight:135,number:30})
WriteResult({ "nInserted" : 1 })
创建多维对象
> db.goods.insert({name:'huawei01',price:1000,weight:135,area:{province:'jiangshu',city:'nanjing'}})
WriteResult({ "nInserted" : 1 })
创建数组信息
> db.goods.insert({name:'xiaomi',price:2000,weight:130,color:['black','white','red']})
WriteResult({ "nInserted" : 1 })
- db.集合名称.find(查询条件) :查询数据
- db.集合名称. findOne(查询条件):取出符合结果的第一条信息,并且以格式化形式返回
查询所有
> db.goods.find()
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
查询第一条
> db.goods.findOne()
{
"_id" : ObjectId("61757e8b238ec10c38b8ce36"),
"name" : "huawei01",
"price" : 1000,
"weight" : 135,
"number" : 30
}
查询条件为name=xiaomi
> db.goods.find({name:'xiaomi'})
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
范围查询
$lt:< $lte:<= $gt:= $gte:>= $ne:!=
> db.goods.find({price:{'$lt':2000}})
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
多条件查询
> db.goods.find({price:{'$lt':2000},price:{'$gt':1000}})
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
> db.goods.find({price:{'$lt':2000},number:{'$gt':10}})
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
多维字段查询
> db.goods.find({'area.city':'nanjing'})
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
数组查询,满足一个条件
> db.goods.find({color:'black'})
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
数组查询,满足多个条件
> db.goods.find({color:{'$all':['black','yellow']}})
> db.goods.find({color:{'$all':['black','red']}})
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
$or,满足其中任意一个条件即可
> db.goods.find({'$or':[{price:{'$gt':1000}},{number:{'$gte':10}}]})
{ "_id" : ObjectId("6175bad25b314fcf56ad19b9"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("6175baf55b314fcf56ad19bb"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
- db.集合名称.find({查询条件},{筛选条件}) :限制查询字段
显示为1,不显示为0;要是1都是1,要是0都是0;_id除外
> db.goods.find({color:{'$all':['black','red']}},{name:1,price:1})
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000 }
> db.goods.find({color:{'$all':['black','red']}},{name:1,price:1,_id:0})
{ "name" : "xiaomi", "price" : 2000 }
> db.goods.find({},{name:1,price:1,_id:0})
{ "name" : "huawei01", "price" : 1000 }
{ "name" : "huawei01", "price" : 1000 }
{ "name" : "xiaomi", "price" : 2000 }
> db.goods.find({},{area:0,color:0,_id:0})
{ "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "name" : "huawei01", "price" : 1000, "weight" : 135 }
{ "name" : "xiaomi", "price" : 2000, "weight" : 130 }
- db.集合名称.count({查询条件}) :统计满足条件的个数
> db.goods.count()
3
> db.goods.count({price:{'$gt':5000}})
0
-
db.集合名.find().limit(NUMBER).skip(NUMBER) :分页查询
limit():取几个 skip():跳过几个
> db.goods.find().limit(1);
{ "_id" : ObjectId("6175bad25b314fcf56ad19b9"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
> db.goods.find().skip(2).limit(1);
> db.goods.find().skip(1).limit(1);
{ "_id" : ObjectId("6175baea5b314fcf56ad19ba"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
- db.集合名.find().sort({KEY:1}) :排序查询
> db.goods.find({},{name:1,price:1,_id:0}).sort({price:-1});
{ "name" : "xiaomi", "price" : 2000 }
{ "name" : "huawei01", "price" : 1000 }
{ "name" : "huawei01", "price" : 1000 }
- db.集合名称.update({查询条件},{修改条件}):修改数据
- db.集合名称.updateOne({查询条件},{修改条件}):修改匹配的第一条
- 不添加$set,原来的数据会被删除
> db.goods.update({name:'xiaomi'},{'$set':{price:8500}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.goods.find({name:'xiaomi'})
{ "_id" : ObjectId("6175baf55b314fcf56ad19bb"), "name" : "xiaomi", "price" : 8500, "weight" : 130, "color" : [ "black", "white", "red" ] }
> db.goods.updateOne({name:'huawei01'},{'$set':{price:1500}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.goods.find({},{name:1,price:1,_id:0})
{ "name" : "huawei01", "price" : 1500 }
{ "name" : "huawei01", "price" : 1000 }
{ "name" : "xiaomi", "price" : 8500 }
- db.集合名称.remove({查询条件}):删除记录
- 真实业务当中,一般不做物理删除,会使用一个标识,来确认数据的状态
> db.goods.remove({price:1000})
WriteResult({ "nRemoved" : 1 })
> db.goods.find({},{name:1,price:1,_id:0})
{ "name" : "huawei01", "price" : 1500 }
{ "name" : "xiaomi", "price" : 8500 }
索引操作
索引介绍
索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
如果查询存在适当的索引,MongoDB可以使用该索引限制必须检查的文档数。 索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储特定字段或一组字段的值,按字段值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。
此外,MongoDB还可以使用索引中的排序返回排序结果
索引类型
-
单字段索引:MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引,称为单字段索引(SingleField Index)。
-
复合索引:MongoDB还支持多个字段的用户定义索引,即复合索引(Compound Index)。
-
其他索引:地理空间索引(Geospatial Index)、文本索引(Text Indexes)、哈希索引(HashedIndexes)。
管理操作
- db.集合名.getIndexes(): 查看索引
> db.goods.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.goods"
}
]
- db.集合名.createIndex({索引}):创建字段索引
创建单个索引
> db.goods.createIndex({userid:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.goods.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.goods"
},
{
"v" : 2,
"key" : {
"userid" : 1
},
"name" : "userid_1",
"ns" : "test.goods"
}
]
创建复合索引
> db.goods.createIndex({userid:1,nickname:-1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
> db.goods.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.goods"
},
{
"v" : 2,
"key" : {
"userid" : 1
},
"name" : "userid_1",
"ns" : "test.goods"
},
{
"v" : 2,
"key" : {
"userid" : 1,
"nickname" : -1
},
"name" : "userid_1_nickname_-1",
"ns" : "test.goods"
}
]
- db.comment.dropIndex({}):删除索引
> db.goods.dropIndex({userid:1,nickname:-1})
{ "nIndexesWas" : 3, "ok" : 1 }
> db.goods.getIndexes()
[
{
"v" : 2,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.goods"
},
{
"v" : 2,
"key" : {
"userid" : 1
},
"name" : "userid_1",
"ns" : "test.goods"
}
]
常用实例
安全限制
相关文档:https://docs.mongodb.com/manual/tutorial/create-users/
mongodb安全事件:https://www.jianshu.com/p/48d17a69e190
限制远程登录
远程传入软件
[root@mongodb ~]# cd /usr/local/mongodb/bin/
[root@mongodb bin]# scp ./mongo root@192.168.139.130:/root
停止本地mongodb
> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2021-10-25T10:31:48.949+0800 I NETWORK [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2021-10-25T10:31:48.949+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2021-10-25T10:31:48.949+0800 I NETWORK [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed
> exit
bye
使用脚本绑定对外IP地址
[root@mongodb bin]# cd /etc/init.d
[root@mongodb init.d]# rz
#上传mongod启动脚本
[root@mongodb init.d]# chmod +x mongod
[root@mongodb init.d]# vim mongod
[root@mongodb init.d]# cat mongod
#!/bin/bash
#mongodb服务操作
#chkconfig - 68 78
BASEDIR="/usr/local/mongodb"
BIN=$BASEDIR"/bin/mongod"
DBPATH=$BASEDIR"/data"
LOGPATH=$BASEDIR"/logs/log.txt"
BIND_IP='127.0.0.1,192.168.139.137' 修改为需要的ip
#引入系统函数库
. /etc/rc.d/init.d/functions
#启动
start () {
echo -n $"Starting $prog: "
$BIN --dbpath=$DBPATH --logpath=$LOGPATH --fork --bind_ip=$BIND_IP &>>/dev/null 添加--bind_ip=$BIND_IP选项
RETVAL=$?
[ $RETVAL -eq 0 ] && echo 'starting'
}
#关闭
stop () {
echo -n $"Stopping $prog: "
$BIN --dbpath=$DBPATH --shutdown
RETVAL=$?
[ $RETVAL -eq 0 ] && echo 'stopd'
}
#重启
restart () {
stop
start
}
#查看状态
mongod_status () {
status $BIN
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
mongod_status
;;
*)
echo "$EXE {start|stop|restart}"
esac
[root@mongodb init.d]# service mongod start
正在启动 :starting
远程连接
[root@mysql1 ~]# ./mongo 192.168.139.137
用户权限管理
创建mongodb的超级管理员
> db.createUser({user:"root",pwd:"root",roles:["root"]})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
在启动脚本中添加--auth参数
[root@mongodb init.d]# vim mongod
15 $BIN --dbpath=$DBPATH --logpath=$LOGPATH --fork --auth --bind_ip=$BIND_IP &>>/dev/null
[root@mongodb init.d]# service mongod restart
登录测试
> use mydb
switched to db mydb
> db.goods.find()
2021-10-22T05:59:57.036+0800 I NETWORK [thread1] trying reconnect to 192.168.139.137:27017 (192.168.139.137) failed
2021-10-22T05:59:57.038+0800 I NETWORK [thread1] reconnect 192.168.139.137:27017 (192.168.139.137) ok
Error: error: {
"ok" : 0,
"errmsg" : "not authorized on mydb to execute command { find: \"goods\", filter: {}, $db: \"mydb\" }",
"code" : 13,
"codeName" : "Unauthorized"
}
#发现登陆失败
#密码验证
> use admin
switched to db admin
> db.auth('root','root')
1
#再切回mydb,发现登陆成功
> use mydb
switched to db mydb
> db.goods.find()
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
远程登录
[root@mysql1 ~]# ./mongo 192.168.139.137 -uroot -proot -authenticationDatabase=admin
> use mydb
switched to db mydb
> db.goods.find()
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
- 添加普通用户,限制其权限为:只对mydb库具有可读权限
超级管理员登录
> use admin
switched to db admin
> db.auth('root','root')
1
创建普通用户
> use mydb
switched to db mydb
> db.createUser({user:'devops',pwd:'devops123',roles:[{role:"read",db:"mydb"}]})
Successfully added user: {
"user" : "devops",
"roles" : [
{
"role" : "read",
"db" : "mydb"
}
]
}
> exit
bye
测试
> use mydb
switched to db mydb
> db.auth('devops','devops123')
1
> db.goods.find()
{ "_id" : ObjectId("61757e8b238ec10c38b8ce36"), "name" : "huawei01", "price" : 1000, "weight" : 135, "number" : 30 }
{ "_id" : ObjectId("61757f12238ec10c38b8ce37"), "name" : "huawei01", "price" : 1000, "weight" : 135, "area" : { "province" : "jiangshu", "city" : "nanjing" } }
{ "_id" : ObjectId("61757fc3238ec10c38b8ce38"), "name" : "xiaomi", "price" : 2000, "weight" : 130, "color" : [ "black", "white", "red" ] }
> db.goods.insert({name:'text'})
WriteResult({
"writeError" : {
"code" : 13,
"errmsg" : "not authorized on mydb to execute command { insert: \"goods\", ordered: true, $db: \"mydb\" }"
}
})
PHP扩展安装
-
在web服务器上安装
-
扩展包安装
[root@web ~]# cd /root/soft
[root@web soft]# rz
[root@web soft]# tar -xzf mongodb-1.5.3.tgz
[root@web soft]# cd mongodb-1.5.3
[root@web mongodb-1.5.3]# phpize
[root@web mongodb-1.5.3]# ./configure && make && make install
- 添加php.ini匹配
[root@web mongodb-1.5.3]# ls /usr/local/php/lib/php/extensions/no-debug-zts-20170718/
memcached.so mongodb.so opcache.a opcache.so redis.so
[root@web mongodb-1.5.3]# vim /usr/local/php/etc/php.ini
870 extension=mongodb.so
[root@web mongodb-1.5.3]# service php-fpm reload
- 浏览器查看
日记统计显示
上传相关脚本
[root@web1 mongodb-1.5.3]# cd /usr/local/nginx/html/tp5shop/public
[root@web1 public]# rm -rf index.php
[root@web1 public]# rz
[root@web1 public]# cat index.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
// [ 应用入口文件 ]
// 定义应用目录
define('APP_PATH', __DIR__ . '/../application/');
$data = array(
// 用户访问的ip
'ip' => $_SERVER['HTTP_X_REAL_IP'],
// 访问地址 访问是什么功能
'url' => $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],
// 用户访问的客户端信息
'agent' => $_SERVER['HTTP_USER_AGENT'],
// 访问的时间
'time' => time()
);
// 连接管理数据库
$manager = new MongoDB\Driver\Manager('mongodb://root:root@192.168.139.137/admin');
// 实列化写入方法
$bulk = new MongoDB\Driver\BulkWrite;
$rs = $bulk->insert($data);
// 执行语句
$result = $manager->executeBulkWrite('tp5shop.logs', $bulk);
// 加载框架引导文件
require __DIR__ . '/../thinkphp/start.php';
- 验证
> use admin
switched to db admin
> db.auth('root','root')
1
> use tp5shop
switched to db tp5shop
> db.logs.find()
{ "_id" : ObjectId("6171053a43b3e9fd8b732c92"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634796858 }
{ "_id" : ObjectId("6172362e2aafe61c38412242"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634874926 }
{ "_id" : ObjectId("617236912aafe61c396f3f62"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634875025 }
{ "_id" : ObjectId("617236922aafe61c38412243"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634875026 }
{ "_id" : ObjectId("617236c42aafe61c396f3f63"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634875076 }
{ "_id" : ObjectId("617105ec43b3e9fd8c5441d2"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634797036 }
{ "_id" : ObjectId("617236df2aafe61c38412244"), "ip" : "192.168.139.1", "url" : "www.server01.com/", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634875103 }
{ "_id" : ObjectId("6171081943b3e9fd8b732c93"), "ip" : "192.168.139.1", "url" : "www.server01.com/home/goods/index/cate_id/251.html", "agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36", "time" : 1634797593 }
桌面管理工具使用
- Robo工具