cncml手绘网

标题: 使用PHP操作MongoDB [打印本页]

作者: admin    时间: 2019-3-9 02:13
标题: 使用PHP操作MongoDB
链接数据库% J3 B8 y# m; b) X7 i5 C9 _
使用下面的代码创建一个数据库链接4 n  p( P9 Q) T
  1. <?php8 u* ?3 ^: F/ G+ D/ q
  2. $connection = new Mongo(mongodb://192.168.1.5:27017); //链接到 192.168.1.5:27017//27017端口是默认的。
    + C; q8 Q  ]5 ^# g# x/ \; x, Z
  3. $connection = new Mongo( "example.com" ); //链接到远程主机(默认端口)' w- l/ s$ q( Q1 G: t3 C; F  w
  4. $connection = new Mongo( "example.com:65432" ); //链接到远程主机的自定义的端口, R/ R, C5 t3 o" b0 r
  5. print_r($connection->listDBs());//能打印出数据库数组,看看有几个数据库。
复制代码

. n9 p6 b! U  w$ H1 ^9 I2 \上图说有一个数据库名字叫local,总大小1个字节,他是空的。看见ok表示运行成功。

- L  e6 T1 D$ r) \
: F# y% d; N5 a8 q" m3 J?>
6 T8 a2 V, Z, W3 q# m
4 Y6 e% x4 A" C3 W% ]. V  P1 J
  z; x$ }5 ~/ t% H6 q+ |1 ?+ H
现在你可以使用$connection链接来操作数据库了
选择数据库& X5 v( P& x, c* U
使用下面的代码来选择一个数据库

( U- k6 N5 ~1 G) r& w1 P
  1. <?php
    " n; O% A( H! b7 r3 y( @# |
  2. $db = $connection->dbname;; T  Y2 I# m6 b8 a0 b& z, {' X7 h
  3. ?>
复制代码
这里的数据库并不一定是一个已经存在的数据库,如果所选择的数据库不存在,则会新建一个数据库,所以在选择数据库的时候,注意一定要填上正确的数据库名* |6 w& ^" \: ?, C- Z7 }
如果拼写错误的话,很有可能会新建一个数据库
  1. <?php  r5 z- B, O8 {: U. h- S1 u
  2. $db = $connection->mybiglongdbname;
    ( V2 J) O- f% D- K# J
  3. //做一些事情( D: \6 F5 ]- }
  4. $db = $connection->mybiglongdbnme;, u! x, N8 z! O' _; E
  5. //现在会连上一个新的数据库
    , y1 t+ `5 R" R; w
  6. ?>
复制代码
获取一个集合
6 k6 s5 B1 t' H获取一个集合跟选择数据库拥有相同的语法格式
8 G% p/ o$ \( c( E& R
  1. <?php$ D. {) O, _$ p! e
  2. $db = $connection->baz;//选择数据库4 e) z; s4 u9 h
  3. $collection = $db->foobar;//选择foobar集合' B% v% y8 f! y2 y/ S! @1 u
  4. //或者使用更简洁的方式
    ) [1 r. m% ]0 \0 e" j: T/ s
  5. $collection = $connection->baz->foobar;' n5 V0 M2 r7 V
  6. ?>
复制代码

* V8 Q0 x! Y) ~( @% e7 _: v
" k. B6 Q& f7 L: h6 ]) K插入一个文档
4 [7 S8 {' e0 j( _多维数组是可以被储存到数据库中的基本单元5 I& C- d5 |9 Q8 s- r
一个随机的文档可能是这样- T( S4 `9 A0 Q: w! Q3 ?2 ~
  1. <?php
    , P8 A/ c) l# k& Z+ ~0 N
  2. $doc = array(. t6 z  V- D7 M6 J& Q
  3. ”name” => “MongoDB”,
    6 Z2 |# v4 ~" _  J+ z* e
  4.     “type” => “database”,
    & L) i% ]  \% m( p$ q, K
  5.     “count” => 1,
    9 ?1 c" V9 e6 [4 C) s: O8 Z( G
  6.     “info” => (object)array( “x” => 203,
    $ h  G  ^8 @8 s& R8 O9 a  }+ a
  7.     “y” => 102),
    5 @' b3 h7 s! T$ F3 A
  8.     “versions” => array(“0.9.7″, “0.9.8″, “0.9.9″)
    6 Q6 l) `- u- i- ?8 _9 _& r! G
  9. );4 F9 K% M5 T7 s" K- L% z; v
  10. ?>
复制代码
注意:你可以嵌套数组与对象,对象与文档在mongodb中几乎是一样的,你可以使用$doc调用一个文档或对象,但是info字段总是一个对象而不是一个文档,
: r1 k" I: o4 O4 [& h本约束适用于所有文档
使用MongoCollection::insert()插入一个文档

- l5 [5 Y9 `: F7 F. S
  1. <?php8 v/ N9 b" S; g/ \% [
  2. $m = new Mongo();
    7 Z: L/ ]6 |/ V) A, m3 W
  3. $collection = $m->foo->bar;
    5 B& D: p2 B# r$ |  x0 D9 M
  4. $collection->insert($doc);
    / P( u& D/ b9 m- Z3 N3 s# t
  5. ?>
复制代码
- w  R! b5 Y% K, p3 e
mongodb 的 insert()、save()  ,区别主要是:若存在主键,insert()  不做操作,而save() 则更改原来的内容为新内容。
存在数据:  { _id : 1, " name " : " n1 " }
insert({ _id : 1, " name " : " n2 " })    会提示错误
save({ _id : 1, " name " : " n2 " })     会把 n1 改为  n2  。
使用MongoCollection::findOne()查询文档/ ]( w" m5 o( V: k0 o) j; E9 @8 y
为了证明上面那段代码的数据已经插入到数据库里了,我们进行简单的 findOne()操作以得到集合中的第一个文档数据,这种方法只返回一个文档数据,
% p. Y4 |$ u* H, B, _  e/ T3 N这种方法适用于在你的查询语句的时候只匹配一个文档或者你只关心第一条数据
: P  s. I) [6 I' @
  1. <?php
    . }( F6 D- H3 N8 v2 o* r' _- f
  2. $obj = $collection->findOne();% Y$ `" v5 y0 k, ?, ^! o, X( D
  3. var_dump( $obj );$ N0 j! E, s3 @; x* h" L' i% @
  4. ?>
    " j/ \. ?- L" Y3 |* S
  5. 你会看到下列结果
    / b: W& ]; A/ t" j0 v7 w
  6. array(5) {
      o& M6 V/ l6 G( i8 K
  7.   ["_id"]=>
    & v1 R/ G1 F. Y
  8.   object(MongoId)#6 (0) {
    ) E6 y, L/ }8 N( W7 {- X
  9.   }( U5 D1 W8 e2 e- j
  10.   ["name"]& N5 i, [7 W- R! M9 G& C3 ?& L
  11.   string(7) “MongoDB”8 _3 I3 J( F, K7 K
  12.   ["type"]=>
    4 n8 _0 Y& Z: q7 n
  13.   string(8) “database”
    ) `7 Y* q* O' S; U: f8 Q! a  r
  14.   ["count"]=># I  @1 h! l- x4 Y& @: m
  15.   int(1)
    1 Q; M2 m8 C' B- P
  16.   ["info"]=>1 s, s7 D) C7 c/ r! n. A6 k
  17.   array (2) {0 Z7 t" l2 E1 N  w* @5 D2 _
  18.     ["x"]=>1 b+ o, E1 Z% [% M+ i& `
  19.     int(203)
    " f2 G( R6 `- R
  20.     ["y"]=>9 P2 m0 ~5 `% Q4 y$ q
  21.     int(102)
    ) u; g3 M' S+ a4 A% |
  22.   }% s) o: c# t( J: `$ U% _
  23.   ["versions"]0 z6 h) F. b7 n1 ?3 o/ w$ r
  24.   array(3) {
    - g. Q% p# g! u' N, n
  25.     [0]=>. h+ H8 t, M/ Z8 O- q. E+ R. e
  26.     string(5) “0.9.7″0 \* l2 b3 {0 B. [: \" Z- \& Q
  27.     [1]=>  E6 M1 [- v9 l, }2 S! c
  28.     string(5) “0.9.8″: D% W. f+ {3 {; X
  29.     [2]=>
    4 ~; e0 o: L# b$ X
  30.     string(5) “0.9.9″, \/ K$ @( t* k% b
  31.   }7 U; w  ~& }0 d1 a$ v/ H/ C" p
  32. }
复制代码

3 u! u9 z) [) q( _
7 w9 \/ f' K3 t) A
注意_id字段自动加载了文档上,MongoDB储存元素中以_以及$开头的都是供内部使用的
添加更多文档
* E( N" L0 p' L7 O' p2 s为了做一些更有趣的事情,我们添加更多简单的文档到集合中,这些文档如下

0 h6 p+ Q  ?5 g
  1. <?php& Y. c/ }- _+ O' D2 |! H8 D
  2. array( “i” => value );
    ! X) J% w2 s( M# z+ [
  3. ?>
复制代码
我们可以使用循环相当有效的插入数据. t3 O- j, o( p4 P* m
  1. <?php
    ! Q' W. C! o1 U# P* _
  2. for($i=0; $i<100; $i++) {
    % G8 m5 q4 ?7 `, |
  3.     $collection->insert( array( “i” => $i ) );
    " o2 a5 a( W. ^2 i  j
  4. }; I1 o. a) i! p$ q. o
  5. ?>
复制代码
注意:我们可以插入不同的字段在同一字符集中,在这方面意味着MongoDB拥有非常自由的储存模式
在一个集合中计算文档的数量
4 p9 W# f$ g8 `5 {+ E) e8 _7 N现在我们插入了101个文档(我们用循环插入了100个,之前还插入了一个),我们可以使用count()来看看我们的数据是不是都被插入进去了

& L  S+ z4 H  X" E
  1. <?php" s$ X9 h7 b5 x) V7 g
  2. echo $collection->count();( b  S& X" t' h
  3. ?>
复制代码
这段代码将打印出101# w( T% [2 A3 q8 |5 z
MongoCollection::count() 也可以查询字段数据
使用游标得到集合中的所有文档0 F5 h1 h( n1 ~8 k. a3 j
为了得到集合中的所有文档,我们可以使用 MongoCollection::find()方法,find()方法返回一个 MongoCursor对象,可以让我们重复得到查询* w3 p, A4 Y9 x8 H5 L
所匹配的的文档
  1. <?php2 _# ~* y6 |3 |: i* a. p
  2. $cursor = $collection->find();0 ?- T) U4 `) e7 z
  3. foreach ($cursor as $id => $value) {0 ?7 B% o0 k; N' M, i
  4.     echo “$id: “;+ Q- i* T, J- [9 j
  5.     var_dump( $value );9 @7 y7 `' G5 L( {. K& s
  6. }" E  c. [- ]% k/ |
  7. ?>
复制代码
这样我们会打印出集合中的这101个文档,$id就是文档中的_id字段,$value 就是文档本身
为查询规定一个标准
. ~# H2 g2 w/ e我们可以通过find()方法得到集合中的文档子集,例如,我们要查询出集合中i字段为71的文档,我们可以使用下列方法

! ]' C( P& w* n, R- h' Y
  1. <?php
    . f8 A: M: K" w+ U6 a% ]
  2. $query = array( “i” => 71 );$ J7 E2 w% l; i8 ]
  3. $cursor = $collection->find( $query );% y* w2 o, |; ~/ C6 M% a% @# \
  4. while( $cursor->hasNext() ) {
    / _( @* Q# `3 H" G
  5.     var_dump( $cursor->getNext() );: L' E& ~6 y; t) m3 L
  6. }. k, N% R( o- O2 D% I7 g! ~5 Z
  7. ?>
复制代码
我们将打印如下数据3 Q! E$ {* I; W) W/ ?; |
  1. array(2) {! i( U" ]3 N/ {% N2 [
  2.   ["_id"]=>
    - w- B; Y# `( y: l3 b
  3.   object(MongoId)#6 (0) {
    0 D  m! Z" n$ Z
  4.   }
    # s3 Y( u# E% D2 j, b  X" Y
  5.   ["i"]=>/ Y$ {4 t' G0 W; f
  6.   int(71). ]% g( a* _& u4 p: I- m
  7.   ["_ns"]=>
    ) G/ B6 R' g( C2 q
  8.   “testCollection”
    " z( H, ~7 _5 |6 N* Y7 U$ @
  9. }
复制代码
为查询设定一个范围& V" ^+ B1 S! d! v
我们可以通过find()创建一个查询语句以得集合中的一个子集,例如如果我们得到所有”i”>50的文档,我们可以使用如下代码
6 P' F6 q9 e; R) L0 H' Y# }) @3 ]
  1. <?php7 j6 A& S9 S( k0 ?# \
  2. $query = array( “i” => array(‘$gt’ =>50)); //注意’$gt’两边的单引号: ~7 m' S& b: I' Q8 ^; t
  3. $cursor = $coll->find( $query );
    , ?! y. ?8 O2 i; U" @
  4. while( $cursor->hasNext() ) {+ R! B* s$ q3 J, Q% X0 C. b, H
  5.     var_dump( $cursor->getNext() );$ f( ~7 U5 z( u6 d
  6. }7 W: y: N* R; y3 p* r2 C0 S2 O2 r8 b
  7. ?>
复制代码
我们同样可以得到20 < i <= 30之间的数据
+ j: q5 `5 C' J7 `! f4 X: P
  1. <?php
    $ d" }- T! |3 N& i
  2. $query = array( “i” => array( “\$gt” => 20, “\$lte” => 30 ) );
    ! Y% Q$ {! K& s, U
  3. $cursor = $coll->find( $query );
    - j" ~8 i# y# f- }
  4. while( $cursor->hasNext() ) {* O- w, b1 F+ p( e
  5.     var_dump( $cursor->getNext() );
    5 D0 U( f! G. ~2 Y" d  d
  6. }4 S( B, D1 r/ \$ A! F8 _
  7. ?>
复制代码
2 l9 D9 E* T7 L- ^
我们非常容易漏掉$美元符号,你也可以选择你自定义的符号来代替美元符号,选择一个不会在你的建里面出现的符号例如”:”,在php.ini中加上这么一句话
# ?6 V3 f$ T0 _+ V; L8 K! Lmongo.cmd = “:”+ n" e2 b' n6 a9 J. F
那么上面的代码就可以替换成 + o- @" x+ S+ ?# C
  1. <?php
    ' i* Q) U5 {1 d! z, F# E$ P9 D
  2. $query = array( “i” => array( “:gt” => 20, “:lte” => 30 ) );! b& }  u% |+ r
  3. ?>
复制代码

" w" o% F1 A+ ?当然你也可以使用ini_set(“mongo.cmd”, “:”)的方法来改变
创建一个索引
* t6 t/ e8 m8 c/ ~3 f) O" ~MongoDB支持索引,并且可以很容易的加到一个集合中,你只要指定某个字段为索引就行了,并且还可以指定 正序索引(1)与 倒序索引(-1)0 U  T0 C# m" w4 s
下面的代码为I创建了索引; [$ [5 w0 E2 H9 p  O
  1. <?php
    ' x/ ~$ X+ [7 j) L' z) \
  2. $coll->ensureIndex( array( “i” => 1 ) );  //在”i”上创建了一个索引# T( @# J3 p9 e, G
  3. $coll->ensureIndex( array( “i” => -1, “j” => 1 ) );//在”i”上创建了倒序索引 在”j”上创建了正序索引
    1 [, o1 G1 A6 H- Q6 o& k
  4. ?>
复制代码

  J8 Q0 i7 b+ q4 e$ `
一个简单的列子: V  I* Z. F- U
这个例子展示了如何链接mongodb数据库,如何选择数据库,如何插入数据,如何查询数据,以及关闭数据库链接
  1. <?php& N4 f. O7 M7 r
  2. //链接% @% H9 y& T  A0 n& S& `, ~- n! ^
  3. $m = new Mongo();9 h+ j6 X; q! ?9 L( @4 k
  4. ) J6 Q; A+ o0 j3 G
  5. // 选择一个数据库
      Y4 e! r4 S" Y- W9 U
  6. $db = $m->comedy;
    ! I. L, G0 V3 S' G- K4 D9 K, t
  7. $collection = $db->cartoons;
    7 m1 I9 Q9 ~5 \$ \. w! C  {- b) o6 |
  8. + k  [; h3 J/ n% f
  9. //添加一个元素
    $ d' q8 u- r; b) A5 n( y" q
  10. $obj = array( "title" => "Calvin and Hobbes", "author" => "Bill Watterson" );( B9 ]% T# e% R- b) K& O$ N
  11. $collection->insert($obj);
    " v. Q, ?; z' G( m% [
  12. . u, v1 e& P% D- Y+ @
  13. //添加另一个元素,使用不同的格式* s& E9 [/ Y1 [/ [% D- h* e
  14. $obj = array( "title" => "XKCD", "online" => true );
    ' B0 {& y* Y( G. O
  15. $collection->insert($obj);
    / X( O# z, K# V, N; j

  16. % ]$ r" X2 ~0 h/ Q1 D! E7 Z
  17. //查询所有的集合
    ' u) L! ~* s* ?
  18. $cursor = $collection->find();+ }8 j: }4 i" Q$ k9 c! I  z, w3 H
  19. 4 T4 E  J: N! t
  20. //重复显示结果* Q0 A6 b% ?) Z
  21. foreach ($cursor as $obj) {
    4 K. O! g' X6 x- ]
  22.     echo $obj["title"] . "\n";
    1 V' Z, v; |& N1 s. I
  23. }
    5 g! B, I! K/ T+ X. o! y! }

  24. 8 j7 u+ }* F* l8 {
  25. // 关闭链接
    # V3 m7 f3 r9 P% W, Y
  26. $m->close();4 w( m8 r9 T& [/ Y5 d0 m
  27. ?>
复制代码
+ R% I9 t; |/ b
输出结果为$ t9 ~2 G# z' `+ D$ Y2 y
  1. Calvin and Hobbes
    ! l2 h3 V( v. O; a' w4 }4 r
  2. XKCD
复制代码

( m' K1 Z& e; g3 B  |4 U

1 _- W* q  [5 \% _; ]3 U  \' f' G, s8 L' ]5 v! E$ A
5 x  a( q0 B/ D  ]+ h: W
4 _( s+ N+ j5 O( T) [: ]" y
- s8 V2 B- s6 w
7 o4 W6 Z$ i5 J5 F4 k! q

  R2 ~: d* N1 I* H% B. C" v- H/ `! u




欢迎光临 cncml手绘网 (http://www.cncml.com/) Powered by Discuz! X3.2