一,掌握权限,理解下面4条基本上就差不多
1,mongodb是没有默认管理员,所以要先添加管理员,在开启权限认证。
2,切换到admin数据库,添加的才是管理员。
3,用户只能在用户所在数据库登录,包括管理员。
4,管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较怪
二,添加管理员
[root@localhost zhangy]# mongo
MongoDB shell version: 2.4.6
connecting to: tank
>use admin //切换到admin数据库
switched to db admin
>show collections
system.indexes
system.users //用户表
>db.system.users.find() //用户表没有数据
>db.addUser('tank','test') //添加一个管理员
{
"user" : "tank",
"readOnly" : false,
"pwd" : "d0695e4f668f6bbc643a",
"_id" : ObjectId("529e5d543b6a4608ac")
}
三,开启动用户权限认证
[root@localhost zhangy]# vim /etc/mongodb.conf //将auth=true前面的注释拿掉
[root@localhost zhangy]# /etc/init.d/mongod restart //重启生效
四,用户只能在用户所在数据库登录,管理员需要通过admin认证后才能管理其他数据库
[root@localhost zhangy]# mongo
MongoDB shell version: 2.4.6
connecting to: tank
>show dbs //显示所有数据库失败,因为还没有认证
Wed Dec 4 06:39:50.925 listDatabases failed:{ "ok" : 0, "errmsg" : "unauthorized" } at src/mongo/shell/mongo.js:46
>db.auth('tank','test') //认证失败,因为这个用户不属于tank这个数据库
Error: 18 { code: 18, ok: 0.0, errmsg: "auth fails" }
0
>use admin//切换到admin数据库
switched to db admin
>db.auth('tank','test') //在admin数据库认证成功
>use tank //切换到tank数据库
switched to db tank
>show collections //不会在提示没有权限了
contact
system.indexes
users
五,添加普通用启
>use tank
switched to db tank
>db.addUser('tank1','test') //为tank数据库添加了一个可读写用户tank1
{
"_id" : ObjectId("529e5f8474b4ca70f3"),
"user" : "tank1",
"readOnly" : false,
"pwd" : "35dd47abff098f5b4f0b567db8edeac5"
}
>db.addUser('tank2','test',true)//为tank数据库添加了一个只读用户tank2
{
"user" : "tank2",
"readOnly" : true,
"pwd" : "c544dded52e6df7b887",
"_id" : ObjectId("529eb24438d5e315")
}
>exit //退出
bye
[root@localhost zhangy]# mongo
MongoDB shell version: 2.4.6
connecting to: tank
>db.auth('tank1','test') //刚添加的用户可以登录。
六,php客户端连接
1, 方法一
$mongo = new Mongo()
$db = $mongo->selectDB('tank') //切换到tank数据库
$db->authenticate("tank3", "test") //认证
$users= $db->selectCollection("users")//选取users表
$cursor = $users->find() //读取数据
foreach ($cursor as $id =>$value) {
echo "$id: "print_r($value)echo "<br>"
}
这种方式比较好理解,根命令行下的 *** 作过程差不多。
2,方法二
$mongo = new Mongo("mongodb://tank3:[email protected]:27017/tank") //认证用户,这里的数据库,只启认证作用
$db = $mongo->selectDB('tank')//选取数据库
$users= $db->selectCollection("users")
$cursor = $users->find()
foreach ($cursor as $id =>$value) {
echo "$id: "print_r($value)echo "<br>"
}
上面二种方法的不同在于,一个先选数据库在认证,一个先认证在选数据库。
模糊查询简介
MongoDB查询条件可以使用正则表达式,从而实现模糊查询的功能。模糊查询可以使用$regex *** 作符或直接使用正则表达式对象。
$regex *** 作符的介绍
MongoDB使用$regex *** 作符来设置匹配字符串的正则表达式,使用PCRE(Pert Compatible Regular Expression)作为正则表达式语言。
regex *** 作符
{<field>:{$regex:/pattern/,$options:’<options>’}}
{<field>:{$regex:’pattern’,$options:’<options>’}}
{<field>:{$regex:/pattern/<options>}}
正则表达式对象
{<field>: /pattern/<options>}$regex与正则表达式对象的区别:
在$in *** 作符中只能使用正则表达式对象,例如:{name:{$in:[/^joe/i,/^jack/}}
在使用隐式的$and *** 作符中,只能使用$regex,例如:{name:{$regex:/^jo/i, $nin:['john']}}
当option选项中包含X或S选项时,只能使用$regex,例如:{name:{$regex:/m.*line/,$options:"si"}}
$regex *** 作符的使用
$regex *** 作符中的option选项可以改变正则匹配的默认行为,它包括i, m, x以及S四个选项,其含义如下
i 忽略大小写,{<field>{$regex/pattern/i}},设置i选项后,模式中的字母会进行大小写不敏感匹配。
m 多行匹配模式,{<field>{$regex/pattern/,$options:'m'},m选项会更改^和$元字符的默认行为,分别使用与行的开头和结尾匹配,而不是与输入字符串的开头和结尾匹配。
x 忽略非转义的空白字符,{<field>:{$regex:/pattern/,$options:'m'},设置x选项后,正则表达式中的非转义的空白字符将被忽略,同时井号(#)被解释为注释的开头注,只能显式位于option选项中。
s 单行匹配模式{<field>:{$regex:/pattern/,$options:'s'},设置s选项后,会改变模式中的点号(.)元字符的默认行为,它会匹配所有字符,包括换行符(\n),只能显式位于option选项中。
使用$regex *** 作符时,需要注意下面几个问题:
i,m,x,s可以组合使用,例如:{name:{$regex:/j*k/,$options:"si"}}
在设置索弓}的字段上进行正则匹配可以提高查询速度,而且当正则表达式使用的是前缀表达式时,查询速度会进一步提高,例如:{name:{$regex: /^joe/}
上面介绍的元字符可能就会让我们在查询的时候出现一些问题,比如有时候想要查询出所有带价格的模糊商品的时候用了.元字符进行模糊搜索,这时候会查询出来全部的数据;
这个时候就需要对模糊查询的条件进行一些 *** 作,转义一下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)