本文目录一览:
php查询mdb最新
一.安装部署mongo
1.创建文件夹
/opt/mongodb/single
/opt/mongodb/data/db
2.进入single目录下载安装包
//下载 tar.gz文件
wget
3.解压 并修改文件名
mv mongodb-linux-x86_64-2.4.6 mongo
4.进入mongo目录
5.创建配置文件
– mkdir conf
– cd conf
– vim conf.properties
#端口
port=27017
#db存放的目录
dbpath=/opt/mongotest/data/db
#后台启动需要配置日志输出
logpath=/opt/mongotest/single/mongo/log/mongo.log
#日志模式
logappend=true
#设置成后台启动
fork=true
6.启动mongo
mongo目录执行
root@chwx2:/opt/mongotest/single/mongo# ./bin/mongod -f conf/conf.properties
about to fork child process, waiting until server is ready for connections.
forked process: 4988
all output going to: /opt/mongotest/single/mongo/log/mongo.log
child process started successfully, parent exiting
表示后台启动mongo成功
二.使用mongo进行日常操作
1.连接mongodb
mongo/bin目录下执行
./mongo
2.查看数据库
show dbs
3.查看当前所在数据库
db
4.创建数据库
use openfire (临时创建 如果不做操作 则离开后被系统删除)
5.在当前数据库删除当前数据库
db.dropDatabase()
6.查看当前库的所有用户
show users
7.查看集合(或者叫表)
show collections
8.创建集合
db.createCollection(“mycollection”)
9.创建集合并制定集合的属性
db.createCollection(“mycol”, { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
字段
类型
描述
capped Boolean (可选)如果为true,则启用封顶集合。封顶集合是固定大小的集合,会自动覆盖最早的条目,当它达到其最大大小。如果指定true,则需要也指定尺寸参数。
autoIndexID Boolean (可选)如果为true,自动创建索引_id字段的默认值是false。
size number (可选)指定最大大小字节封顶集合。如果封顶如果是 true,那么你还需要指定这个字段。
max number (可选)指定封顶集合允许在文件的最大数量。
10.另一种创建集合
(当插入一条数据时,不存在mongodb会帮我们创建,和创建数据库同理)
db.MySecondCollection.insert({“name” : “ming”})
11.删除当前库的一个集合
db.CollectionName.drop()
12.插入一条数据
db.MyFirstCollection.insert({“_id”:”3”,”title”:”mongotest”,”description”:”this is test”})
注意:插入的都是JSON形式的,所以一定要用{},否则会报错:
Sat Mar 19 14:22:39.160 SyntaxError: Unexpected token :
13.插入一条_id存在的数据
db.MyFirstCollection.insert({“_id”:”3”,”title”:”mm”})
输出:E11000 duplicate key error index: openfire.MyFirstCollection.$_id_ dup key: { : “3” }
解释:_id即是mongodb的默认主键,默认自动生成,我们可以直接设置以达到我们想要的目的
问:插入一条和原来集合完全不一样的数据可以吗?
答:可以,所以我们要在程序中规避,手动指定我们一个集合里面的字段,否则就无法实现查询及其他功能了
db.MyFirstCollection.insert({"newTitle":"null"})
db.MyFirstCollection.find();
{ "_id" : "3", "title" : "new title", "description" : "this is test" }
{ "_id" : ObjectId("56ecf4fe0dceecace97c4506"), "newTitle" : "null" }
14.查看集合第一条记录
db.MySecondCollection.findOne();
输出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }
15.查找一条/多条特定数据
db.MySecondCollection.findOne({“name”:”ming”})
输出:{ “_id” : ObjectId(“56ecde0662552d15c443dd4a”), “name” : “ming” }
16.更新一条记录
db.MyFirstCollection.update({“title”:”mongotest”},{$set:{“title”:”new title”}},true,false)
结果:
db.MyFirstCollection.findOne()
{ “_id” : “3”, “title” : “new title”, “description” : “this is test” }
update详解
db.collection.update(criteria,objNew,upsert,multi)
criteria:查询条件
objNew:update对象和一些更新操作符
upsert:如果不存在update的记录,是否插入objNew这个新的文档,true为插入,默认为false,不插入。
multi:默认是false,只更新找到的第一条记录。如果为true,把按条件查询出来的记录全部更新。
更新操作符:
1.$inc
用法:{$inc:{field:value}}
作用:对一个数字字段的某个field增加value
示例:db.students.update({name:"student"},{$inc:{age:5}})
2.$set
用法:{$set:{field:value}}
作用:把文档中某个字段field的值设为value
示例:db.students.update({name:"student"},{$set:{age:23}})
3.$unset
用法:{$unset:{field:1}}
作用:删除某个字段field
示例: db.students.update({name:"student"},{$unset:{age:1}})
4.$push
用法:{$push:{field:value}}
作用:把value追加到field里。注:field只能是数组类型,如果field不存在,会自动插入一个数组类型
示例:db.students.update({name:"student"},{$push:{"title":"major"}}
5.$rename
用法:{$rename:{old_field_name:new_field_name}}
作用:对字段进行重命名(不是值,是字段)
示例:db.students.update({name:"student"},{$rename:{"name":"newname"}})
设置用户权限及访问
1.给admin添加用户
切换到admin库:use admin
添加admin用户:db.addUser(“root”,”admin”)
注意:必须先给admin库添加用户,否则就算给具体的库添加了用户,后续进入依然能操作具体库.
因为默认admin库用户具有最高权限,相当于具体库需要认证时,进入的用户持有的是admin的权限,所以无需认证依然能进行操作.
2.给具体库添加用户
use openfire
db.addUser("openfire","password")
3.重启mongo并在启动时配置需要认证
方法一:退出重启并加上auth参数
./bin/mongod -f conf/conf.properties –auth(注意是两个-)
方法二:修改配置文件,加上参数(推荐)
auth=true
3.测试权限
use openfire
db.MySecondCollection.findOne();
Sat Mar 19 14:04:55.653 error: {
"$err" : "not authorized for query on openfire.MySecondCollection",
"code" : 16550
} at src/mongo/shell/query.js:128
4.认证并操作
//此处应该设置成更加恰当的用户名及密码
db.auth("openfire","password")
1
db.MySecondCollection.findOne()
{ "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }
5.另一种方法认证
在进入mongo时候加上数据库及用户名、密码
./bin/mongo openfire -uopenfire -ppassword
root@test:/opt/mongotest/single/mongo# ./bin/mongo openfire -uopenfire -ppassword
MongoDB shell version: 2.4.6
connecting to: openfire
db
openfire
db.MySecondCollection.findOne()
{ "_id" : ObjectId("56ecde0662552d15c443dd4a"), "name" : "ming" }
mongdb进阶
1.find()指定返回字段
作用:减少流量
如果key:value,返回的value是个非常大的JSON,而我们不需要这么多字段,也许我们只需要其中的一个.
那么使用projection来过滤:
db.collection.find(query, projection) 此处projection就是返回值的过滤条件
参数
类型
描述
query 文档 可选. 使用查询操作符指定查询条件
projection 文档 可选.使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略).
返回值: 匹配查询条件的文档集合的游标. 如果指定投影参数,查询出的文档返回指定的键 ,”_id”键也可以从集合中移除掉。
_id不指定的话,总是会返回.
1或者true代表返回,0或者false代表不返回
示例:
db.MyFirstCollection.findOne({“title”:”new title”},{“description”:1,”_id”:0});
{ “description” : “this is test” }
也可以使用表达式:
db.MyFirstCollection.findOne({“title”:”new title”},{Items:{“$slice”:[3,1]}});
引用:
mongodb 3.2怎么在php中连接
表标PHP已经自带了mongo功能,你就可以操作下面的代码(但是你必须有安装mongodb服务器)
一、连接数据库
使用下面的代码创建一个数据库链接
复制代码 代码如下:
?php
$connection = new Mongo(mongodb://192.168.1.5:27017); //链接到 192.168.1.5:27017//27017端口是默认的。
$connection = new Mongo( "example.com" ); //链接到远程主机(默认端口)
$connection = new Mongo( "example.com:65432" ); //链接到远程主机的自定义的端口
print_r($connection-listDBs());//能打印出数据库数组,看看有几个数据库。
?
如图:
上图说有一个数据库名字叫local,总大小1个字节,他是空的。看见ok表示运行成功。
现在你可以使用$connection链接来操作数据库了
选择数据库
使用下面的代码来选择一个数据库
复制代码 代码如下:
?php
$db = $connection-dbname;
?
这里的数据库并不一定是一个已经存在的数据库,如果所选择的数据库不存在,则会新建一个数据库,所以在选择数据库的时候,注意一定要填上正确的数据库名
如果拼写错误的话,很有可能会新建一个数据库
复制代码 代码如下:
?php
$db = $connection-mybiglongdbname;
//做一些事情
$db = $connection-mybiglongdbnme;
//现在会连上一个新的数据库
?
获取一个集合
获取一个集合跟选择数据库拥有相同的语法格式
复制代码 代码如下:
?php
$db = $connection-baz;//选择数据库
$collection = $db-foobar;//选择foobar集合
//或者使用更简洁的方式
$collection = $connection-baz-foobar;
?
插入一个文档
多维数组是可以被储存到数据库中的基本单元
一个随机的文档可能是这样
复制代码 代码如下:
?php
$doc = array(
”name” = “MongoDB”,
“type” = “database”,
“count” = 1,
“info” = (object)array( “x” = 203,
“y” = 102),
“versions” = array(“0.9.7″, “0.9.8″, “0.9.9″)
);
?
注意:你可以嵌套数组与对象,对象与文档在mongodb中几乎是一样的,你可以使用$doc调用一个文档或对象,但是info字段总是一个对象而不是一个文档,
本约束适用于所有文档
使用MongoCollection::insert()插入一个文档
复制代码 代码如下:
?php
$m = new Mongo();
$collection = $m-foo-bar;
$collection-insert($doc);
?
mongodb 的 insert()、save() ,区别主要是:若存在主键,insert() 不做操作,而save() 则更改原来的内容为新内容。
存在数据: { _id : 1, " name " : " n1 " }
insert({ _id : 1, " name " : " n2 " }) 会提示错误
save({ _id : 1, " name " : " n2 " }) 会把 n1 改为 n2 。
使用MongoCollection::findOne()查询文档
为了证明上面那段代码的数据已经插入到数据库里了,我们进行简单的 findOne()操作以得到集合中的第一个文档数据,这种方法只返回一个文档数据,
这种方法适用于在你的查询语句的时候只匹配一个文档或者你只关心第一条数据
复制代码 代码如下:
?php
$obj = $collection-findOne();
var_dump( $obj );
?
你会看到下列结果
复制代码 代码如下:
array(5) {
["_id"]=
object(MongoId)#6 (0) {
}
["name"]
string(7) “MongoDB”
["type"]=
string(8) “database”
["count"]=
int(1)
["info"]=
array (2) {
["x"]=
int(203)
["y"]=
int(102)
}
["versions"]
array(3) {
[0]=
string(5) “0.9.7″
[1]=
string(5) “0.9.8″
[2]=
string(5) “0.9.9″
}
}
注意_id字段自动加载了文档上,MongoDB储存元素中以_以及$开头的都是供内部使用的
添加更多文档
为了做一些更有趣的事情,我们添加更多简单的文档到集合中,这些文档如下
复制代码 代码如下:
?php
array( “i” = value );
?
我们可以使用循环相当有效的插入数据
复制代码 代码如下:
?php
for($i=0; $i100; $i++) {
$collection-insert( array( “i” = $i ) );
}
?
注意:我们可以插入不同的字段在同一字符集中,在这方面意味着MongoDB拥有非常自由的储存模式
在一个集合中计算文档的数量
现在我们插入了101个文档(我们用循环插入了100个,之前还插入了一个),我们可以使用count()来看看我们的数据是不是都被插入进去了
复制代码 代码如下:
?php
echo $collection-count();
?
这段代码将打印出101
MongoCollection::count() 也可以查询字段数据
使用游标得到集合中的所有文档
为了得到集合中的所有文档,我们可以使用 MongoCollection::find()方法,find()方法返回一个 MongoCursor对象,可以让我们重复得到查询所匹配的的文档
复制代码 代码如下:
?php
$cursor = $collection-find();
foreach ($cursor as $id = $value) {
echo “$id: “;
var_dump( $value );
}
?
这样我们会打印出集合中的这101个文档,$id就是文档中的_id字段,$value 就是文档本身
为查询规定一个标准
我们可以通过find()方法得到集合中的文档子集,例如,我们要查询出集合中i字段为71的文档,我们可以使用下列方法
复制代码 代码如下:
?php
$query = array( “i” = 71 );
$cursor = $collection-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们将打印如下数据
复制代码 代码如下:
array(2) {
["_id"]=
object(MongoId)#6 (0) {
}
["i"]=
int(71)
["_ns"]=
“testCollection”
}
为查询设定一个范围
我们可以通过find()创建一个查询语句以得集合中的一个子集,例如如果我们得到所有”i”50的文档,我们可以使用如下代码
复制代码 代码如下:
?php
$query = array( “i” = array(‘$gt' =50)); //注意'$gt'两边的单引号
$cursor = $coll-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们同样可以得到20 i = 30之间的数据
复制代码 代码如下:
?php
$query = array( “i” = array( “\$gt” = 20, “\$lte” = 30 ) );
$cursor = $coll-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们非常容易漏掉$美元符号,你也可以选择你自定义的符号来代替美元符号,选择一个不会在你的建里面出现的符号例如”:”,在php.ini中加上这么一句话
复制代码 代码如下:
mongo.cmd = “:”
那么上面的代码就可以替换成
复制代码 代码如下:
?php
$query = array( “i” = array( “:gt” = 20, “:lte” = 30 ) );
?
当然你也可以使用ini_set(“mongo.cmd”, “:”)的方法来改变
创建一个索引
MongoDB支持索引,并且可以很容易的加到一个集合中,你只要指定某个字段为索引就行了,并且还可以指定 正序索引(1)与 倒序索引(-1)
下面的代码为I创建了索引
复制代码 代码如下:
?php
$coll-ensureIndex( array( “i” = 1 ) ); //在”i”上创建了一个索引
$coll-ensureIndex( array( “i” = -1, “j” = 1 ) );//在”i”上创建了倒序索引 在”j”上创建了正序索引
?
一个完整的简单例子
这个例子展示了如何链接mongodb数据库,如何选择数据库,如何插入数据,如何查询数据,以及关闭数据库链接
复制代码 代码如下:
?php
//链接
$m = new Mongo();
// 选择一个数据库
$db = $m-comedy;
$collection = $db-cartoons;
//添加一个元素
$obj = array( "title" = "Calvin and Hobbes", "author" = "Bill Watterson" );
$collection-insert($obj);
//修改
$newdata = array('$set' = array("title" = "Calvin and Hobbes"));
$collection-update(array("author" = "caleng"), $newdata);
//删除
$collection-remove(array('author'='caleng'), array("justOne" = true));
//添加另一个元素,使用不同的格式
$obj = array( "title" = "XKCD", "online" = true );
$collection-insert($obj);
//查询所有的集合
$cursor = $collection-find();
//重复显示结果
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
// 关闭链接
$m-close();
?
输出结果为
复制代码 代码如下:
Calvin and Hobbes
XKCD
mongo php 操作 怎样更新一条数据
PHP操作MongoDB数据库的简单示例。
Mongodb的常用操作
参看手册,php官方的
也可以参看mongodb官方的教程。
一, Mognodb数据库连接
1)、默认格式
复制代码 代码示例:
$m = new Mongo();
//这里采用默认连接本机的27017端口,当然也可以连接远程主机如 192.168.0.4:27017,如果端口是27017,端口可以省略。
2)、标准连接
$m = new Mongo(“mongodb://${username}:${password}@localhost”);
实例:
复制代码 代码示例:
$m = new Mongo(“mongodb://127.0.0.1:27017/admin:admin”);
数据库的用户名和密码都是admin
数据库操作:
1)、插入数据:
复制代码 代码示例:
?php
//这里采用默认连接本机的27017端口,当然你也可以连接远程主机如192.168.0.4:27017
//如果端口是27017,端口可以省略
$m = new Mongo("mongodb://127.0.0.1:27017/admin:admin");
//选择comedy数据库,如果以前没该数据库会自动创建,也可以用$m-selectDB("comedy");
$db = $m-comedy;
//选择comedy里面的collection集合,相当于RDBMS里面的表,也可以使用
$collection = $db-collection;
$db-selectCollection("collection");
/*********添加一个元素**************/
$obj = array("title" = "php1", "author" = "Bill Watterson");
//将$obj 添加到$collection 集合中
$collection-insert($obj);
/*********添加另一个元素**************/
$obj = array("title" = "huaibei", "online" = true);
$collection-insert($obj);
//$query = array("title" = "huaibei");
$query = array( "_id" = $obj['_id'] );
$cursor = $collection-find($query);
//遍历所有集合中的文档
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
echo $obj["_id"] . "\n";
}
//断开MongoDB连接
$m-close();
2)、带条件的查询
查询 title为huaibei的字段
1 $query = array( ”title” = ”huaibei” );
2 $cursor = $collection-find( $query ); // 在$collectio集合中查找满足$query的文档
常用的SQL转化为mongodb的条件
复制代码 代码示例:
mysql: id = 123
mongo: array(‘id’=123)
mysql: name link ’%bar%’
mongo: array(‘name’ = new MongoRegex(‘/.*bar.*/i’))
mysql: where id 10
mongo: array(‘id’ = array(‘$gt’ = 10))
mysql: where id = 10
mongo: array(‘id’ = array(‘$gte’ = 10))
mysql: where id 10
mongo: array(‘id’ = array(‘$lt’ = 10))
mysql: where id = 10
mongo: array(‘id’ = array(‘$lte’ = 10))
mysql: where id 1 and id 10
mongo: array(‘id’ = array(‘$gt’ = 1,’$lt’ = 10))
mysql: where id 10
mongo: array(‘id’ = array(‘$ne’ = 10))
mysql: where id in(123)
mongo: array(‘id’ = array(‘$in’ = array(1,2,3)))
mysql: where id not in(123)
mongo: array(‘id’ = array(‘$nin’ = array(1,2,3)))
mysql: where id = 2 or id = 9
mongo: array(‘id’ = array(‘$or’ = array(array(‘id’=2),array(‘id’=9))))
mysql: order by name asc
mongo: array(‘sort’=array(‘name’=1))
mysql: order by name desc
mongo: array(‘sort’=array(‘name’=-1))
mysql: limit 0,2
mongo: array(‘limit’=array(‘offset’=0,’rows’=2))
mysql: select name,email
mongo: array(‘name’,'email’)
mysql: select count(name)
mongo: array(‘COUNT’) //注意:COUNT为大写
更详细的转换参考
注意事项:
查询时,每个Object插入时都会自动生成一个独特的_id,它相当于RDBMS中的主键,用于查询时非常方便 (_id每一都不同,很像自动增加的id)
例如:
复制代码 代码示例:
?php
$param = array("name" = "joe");
$collection-insert($param);
$joe = $collection-findOne(array("_id" = $param['_id']));
print_R($joe);
$m-close();
返回结果:Array ( [_id] = MongoId Object ( [$id] = 4fd30e21870da83416000002 ) [name] = joe )
更改字段值:
复制代码 代码示例:
?php
$sign = array("title" = 'php1');
$param = array("title" = 'php1','author'='test');
$joe = $collection-update($sign, $param);
删除一个数据库:
复制代码 代码示例:
$m - dropDB(“comedy”);
列出所有可用数据库:
复制代码 代码示例:
$m-listDBs(); //无返回值
附,mongodb常用的数据库方法
MongoDB中有用的函数:
创建一个MongoDB对象
复制代码 代码示例:
?php
$mo = new Mongo();
$db = new MongoDB($mo,’dbname’);//通过创建方式获得一个MongoDB对象
删除当前DB
复制代码 代码示例:
?php
$db = $mo-dbname;
$db-drop();
获得当前数据库名
复制代码 代码示例:
?php
$db = $mo-dbname;
$db-_tostring();
选择想要的collection:
复制代码 代码示例:
A:
$mo = new Mongo();
$coll = $mo-dbname-collname;//获得一个collection对象
B:
$db = $mo-selectDB(’dbname’);
$coll = $db-collname;
C:
$db = $mo-dbname;
$coll = $db-collname;
D:
$db = $mo-dbname;
$coll = $db-selectCollectoin(’collname’);//获得一个collection对象
插入数据(MongoCollection对象):
MongoCollection::insert(array $a,array $options)
array $a 要插入的数组
array $options 选项
safe 是否返回操作结果信息
fsync 是否直接插入到物理硬盘
例子:
复制代码 代码示例:
$coll = $mo-db-foo;
$a = array(’a’=’b’);
$options = array(’safe’=true);
$rs =$coll-insert($a,$options);
$rs为一个array型的数组,包含操作信息
删除数据库中的记录(MongoCollection对象):
MongoCollection::remove(array $criteria,array $options)
array $criteria 条件
array $options 选项
safe 是否返回操作结果
fsync 是否是直接影响到物理硬盘
justOne 是否只影响一条记录
例子:
复制代码 代码示例:
$coll = $mo-db-coll;
$c = array(’a’=1,’s’=array(’$lt’=100));
$options = array(’safe’=true);
$rs = $coll-remove($c,$options);
$rs为一个array型的数组,包含操作信息
更新数据库中的记录(MongoCollection对象):
MongoCollection::update(array $criceria,array $newobj,array $options)
array $criteria 条件
array $newobj 要更新的内容
array $options 选项
safe 是否返回操作结果
fsync 是否是直接影响到物理硬盘
upsert 是否没有匹配数据就添加一条新的
multiple 是否影响所有符合条件的记录,默认只影响一条
例子:
复制代码 代码示例:
$coll = $mo-db-coll;
$c = array(’a’=1,’s’=array(’$lt’=100));
$newobj = array(’e’=’f’,’x’=’y’);
$options = array(’safe’=true,’multiple’=true);
$rs = $coll-remove($c,$newobj,$options);
$rs为一个array型的数组,包含操作信息
查询collection获得单条记录(MongoCollection类):
array MongoCollection::findOne(array $query,array $fields)
array $query 条件
array $fields 要获得的字段
例子:
复制代码 代码示例:
$coll = $mo-db-coll;
$query = array(’s’=array(’$lt’=100));
$fields = array(’a’=true,’b’=true);
$rs = $coll-findOne($query,$fields);
如果有结果就返回一个array,如果没有结果就返回NULL
查询collection获得多条记录(MongoCollection类):
MongoCursor MongoCollection::find(array $query,array $fields)
array $query 条件
array $fields 要获得的字段
例子:
复制代码 代码示例:
$coll = $mo-db-coll;
$query = array(’s’=array(’$lt’=100));
$fields = array(’a’=true,’b’=true);
$cursor = $coll-find($query,$fields);
//排序
$cursor-sort(array(‘字段’=-1));(-1倒序,1正序)
//跳过部分记录
$cursor-skip(100);跳过100行
//只显示部分记录
$cursor-limit(100);只显示100行
返回一个游标记录对象MongoCursor。
针对游标对象MongoCursor的操作(MongoCursor类):
循环或结果记录:
复制代码 代码示例:
$cursor = $coll-find($query,$fields);
while($cursor-hasNext()){
$r = $cursor-getNext();
var_dump($r);
}
或者
$cursor = $coll-find($query,$fields);
foreache($cursor as $k=$v){
var_dump($v);
}
或者
$cursor = $coll-find($query,$fields);
$array= iterator_to_array($cursor);