首頁 >後端開發 >php教程 >MongoDB在php用法

MongoDB在php用法

巴扎黑
巴扎黑原創
2016-11-09 14:00:121444瀏覽

一. Mongodb的基本概念
1. Mongodb資料庫的命名規則:
不能是空字串(“”)
不得含有‘’(空格)、.、$、/、和

D:mongodbbin>mongo
另一種方法是,在 Windows 資源管理器中導航至 C:mongobin 並雙擊 mongo.exe。
    無論選擇哪一種方法來啟動 shell都會出現
    MongoDB shell version: 1.6.5
connecting to: test
>
    現在已連接到測試伺服器。
2.MongoDB在Linux下的安裝設定
1.  32位元的linux
$ curl http://downloads.mongodb.org/linux/mongodb-linux-i686-1.4.4.tgz > mongo.tgz tar xzf mongo.tgz
對於64位的linux
$ curl http://downloads.mongodb.org/linux/mongodb-linux-x86_64-1.4.4.tgz > mongo.tgz
$ xtgzf mtgz 等安裝curl 先安裝apt-get install curl
2.  建立資料資料夾預設情況下,MongoDB會在/data/db/這個資料夾存放數據,這個資料夾需要自己手動建立。 以以下方式建立: $ adduser mongodb $ passwd mongodb $ sudo mkdir -p /data/db/ $ sudo chown `id -u` /data/db $ chown -R mongodb:mongodb /data 當然可以透過--dbpath指令指定MongoDB將資料儲存到另外的目錄中去。
3.  讓資料庫運作起來在控制台中: $ nohup ./mongodb-xxxxxxx/bin/mongod & $ ./mongodb-xxxxxxx/bin/mongo > db.foo.save( { a : 1 } ) > db.foo .find() 結果是: { "_id" : ObjectId("4cd181a31415ffb41a094f43"), "a" : 1 } OK! !
二. Mongodb指令及相關操作
a)  show指令
ii.  在dos中輸入show db 查看目前所有的資料庫
> show dbs
admin
alphabet
color
colors
local.目前資料庫下所有的表
> use mymongo
switched to db mymongo
> show collections
colors
shell.colors
system.indexes
>
b)  use命令
i. 新建一個庫。如果這個函式庫沒有數據,則系統在一段時間後將銷毀
ii.  use [databaseName]
c)  insert指令
i.  新增數據,資料形式為json格式
ii.  如果insert新增的資料中沒有表,則會新建一張表並且在將數據添加入表中
iii.  db.[表名].insert()
> db.dingdan.insert(
... {
...     order_id: 109384,
.. .     order_date: new Date("12/04/2010"),
...     customer: {
...                phone : "(555) 123-4567"
...     },
...     payment: {
...               paid_in_full: true
.. .     },
...     items: [
...         {
...         scription: "A sample product",
...             quantity: 1,
...           : 75.99,
...         }, {
...             sku: "XYZ3400 ...             quantity: 2,
...             price_per_unit: 2000
.. .         }
...     ],
...     cashier_id: 340582242
... }
... )
>
d)  save 指令
i.  保存數據
ii.  如果表中無此數據則將數據添加入表中
iii.  如果表中存在此數據,則將新的數據修改
iv.  db.[表名].save()
db.collection.save( x )
x就是要更新的對象,只能是單一記錄。
如果在collection內已經存在一個和x物件相同的"_id"的記錄。 mongodb就會把x對象取代collection內已經存在的記錄,否則會插入x對象,如果x內沒有_id,系統會自動產生一個再插入。相當於上面update語句的upsert=true,multi=false的情況。

db.test0.save({count:40,test1:"OK"}); _id系統會產生
db.test0.save({_id:40,count:40,test1:"OK"}); 如果test0內有_id等於40的,會替換,否則插入。
e)  remove指令
i.  刪除表中所指定的一條資料
ii.  db.[表名].remove()
在colors表中新增一筆記錄
> db.colors.save({"color": "112233"})
> db.colors.find()
{ "_id" : ObjectId("4e9bc2024fadb58af17b2f01"), "color" : "ff0000" }
{" " : "ff0000" }
{ "_id" : ObjectId("4e9bc2384fadb58af17b2f03"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9 "_id" : ObjectId("4e9bc2394fadb58af17b2f05"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23a4fadb58af17b2f06"), "color"4e9bc23a4fadb58af17b2f06"), "color" 3a4fadb58af17b2f07 "), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f08"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9b235" ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0a"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0b"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23d4fadb58af17b2f0c"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9e3f435240000000005a2d"), "color"e3f435240000000005a2d"), "color"" remove({"color":"112233"})
> db.colors.find()
{ "_id" : ObjectId("4e9bc2024fadb58af17b2f01"), "color" : "ff0000" }
{ "4e9bc2374fadb58af17b2f02"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2384fadb58af17b2f03"), "color" : "ff0000" b2f04"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2394fadb58af17b2f05"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bbc23a4fas586" _id" : ObjectId("4e9bc23a4fadb58af17b2f07"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f08"), "color"4e9bc23b4fadb58af17b2f08"), "color" 3b4fadb58af17b2f09" ), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0a"), "color" : "ff0000" }
{ "_id" : ObjectObject("4e9b2300" " }
{ "_id" : ObjectId("4e9bc23d4fadb58af17b2f0c"), "color" : "ff0000" }
f)  update datei.  修改資料
ii. .update( criteria, objNew, upsert, multi )

criteria : update的查詢條件,類似sql update查詢內where後面的
objNew : update的物件和一些更新的運算符(如$,$inc...)等等,也可以理解為sql update查詢內set後面的
upsert : 這個參數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
multi : mongodb預設是false,只更新找到的第一筆記錄,如果這個參數為true,就把依條件查出來多筆記錄全部更新。

例:
db.test0.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } ); 只更新了第一筆記錄
db. test0.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true ); 全更新了

db.test0.update( { "count " : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false ); 只加進去了第一條

db.test0.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true ); 全加進去了
db.test0.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );全更新了
db.test0.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );只更新了第一條

g)  find指令
i.  查詢數據,可配合skip與limit方法使用達到分頁效果。
ii.  db.[表名].find({}).skip([num1]).limit([num2]),num1從第幾個資料開始,num2為所查詢的資料條數,如果資料不足,則以所剩資料為準
iii.  db.[表名].find({[_id:{ < : num }]})中括號中為查詢條件範例,大於小於等關係運算子則使用轉譯字符代替。
> use zm
switched to db zm
> db.zm.find().skip(10).limit(5);
{ "_id" : ObjectId("4e9e3d6b5240000000005a1" "code" : 107 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1d"), "char" : "l", "code" : 108 }
{ "_id" : "l", "code" : 108 }
{ "_id" : ObjectIdd"4e0e" "m", "code" : 109 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1f"), "char" : "n", "code" : 110 }
{ "_id" : Objecte", "code" : 110 }
{ "_id" : Objecte0(b45000b" "char" : "o", "code" : 111 }
>
h)  findOne指令
i.  查詢指定查詢中的第一個指令
ii.  db.[表名].findOne()
> db. zm.findOne()
{ "_id" : ObjectId("4e9e3d6b5240000000005a12"), "char" : "a", "code" : 97 }
註:findOne中的O必須大寫。
i)  function
i.  自訂函數,定義完後可直接呼叫
ii.  function testFunction(op1,op2,op3…){}
iii.  “testFunction” : function(op1,op2,op3…) {}
iv.  定義好的函數可以直接調用,可以使用return返回資料
> function testFunction(){
... db.zm.remove({"code":{$in:[100,101,102,103]}})
... return db.zm.find({})
... }
> testFunction()
{ "_id" : ObjectId("4e9e3d6b5240000000005a12"), "char" : "a," }
{ "_id" : ObjectId("4e9e3d6b5240000000005a13"), "char" : "b", "code" : 98 }
{ "_id" : ObjectId("4e9e3d6b52400000" code" : 99 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a19"), "char" : "h", "code" : 104 }
{ "_id" : ObjectId(69e030" i", "code" : 105 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1b"), "char" : "j", "code" : 106 }
》 char" : "k", "code" : 107 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1d"), "char" : "l", "code" : 108 }
{ "), "char" : "m", "code" : 109 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1f"), "char" : "n", "code" : 110 }
{_id" ObjectId("4e9e3d6b5240000000005a20"), "char" : "o", "code" : 111 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a21"" "_id" : ObjectId("4e9e3d6b5240000000005a22"), "char" : "q", "code" : 113 }
{ "_id" : ObjectId("4e9e3d6b524000020000 114 }
{ "_id" : ObjectId("4e9e3d6b524000000005a24"), "char" : "s", "code" : 115 }
{ "_id" : ObjectId("4e9e306b" "code" : 116 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a26"), "char" : "u", "code" : 117 }
{ "_id" : “ "v", "code" : 118 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a28"), "char" : "w", "code" : 119 }
{ "_id" : Objecte0( "char" : "x", "code" : 120 }
has more
j)  var
i.  變數命名類型
ii.  同JS中的var一樣。
1.  var [name] 命名也與js變數命名規則一致。
k)  print指令
i.  用於列印
ii.  print([Strings]);
iii.  若列印物件為mongo數據,則會無法辨識。
l)  printJson指令
i.  用於列印資料
ii.  printJson([json]);
m)  shutdown
i.  mongodb
ii. ();
server should be down…
MongoDB 支援各種條件運算符,包括:
?  $lt (小於)
?  $lte (小於等於)
?  $gt (大於)
?  $gte(小於)等於 $gte (大於)等於 $gte (大於)
?  $all (符合數組中的所有值)
?  $exists (檢查字段是否存在)
?  $mod (模數)
?  $ne (不等)
?  $in (匹配數組一個或多個值?  $ne (不等)
?  $in (匹配數組一個或多個值?  $ne (不等)
?  $in (匹配數組一個或多個值?  $ne (不等)
?  $in (匹配數組一個或多個值)
?  $nin (符合陣列中的零值)
?  $or (符合一個或另一個查詢)
?  $nor (不符合查詢)
?  $size (符合具有預定數量元素的任何陣列)
? $type (符合指定BSON 資料型別的值)
?  $not (不等於)

db.表名.find({欄位名稱:{$gt:100}})

mongodb的更新運算子:

1 ) $inc

用法:{ $inc : { field : value } }

意思對一個數字字段field增加value,例:

> db.test0.find( { "_id" : 15 } );🎜{ "_id" : { "floatApprox" : 15 }, "count" : 16, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", "test4" : "OK", "test5" : "OK" }🎜

> db.test0.update( { "_id" : 15 } , { $inc : { "count" : 1 } } );
> db.test0.find( { "_id" : 15 } );
{ " _id" : { "floatApprox" : 15 }, "count" : 17, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", "test4" : "OK", " test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $inc : { "count" : 2 } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 19, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", " test4" : "OK", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $inc : { "count" : -1 } } );
> db .test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : "TESTTEST", "test2" : "OK", "test3" : "TESTTEST", "test4" : "OK", "test5" : "OK" }


2) $set

相當於用法:{ $set : { field : value } }

就是相當於用法:{ $set : { field : value } }

就是相當於用法sql的set field = value,全部資料型別都支援$set。例:
> db.test0.update( { "_id" : 15 } , { $set : { "test1" : "testv1","test2" : "testv2","test3" : "testv3","test4" : "testv4" } } );

> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : " testv1", "test2" : "testv2", "test3" : "testv3", "test4" : "testv4", "test5" : "OK" }

3) $unset

用法:{ $unset : { { field : 1} }

顧名思義,就是刪除欄位了。例:
> db.test0.update( { "_id" : 15 } , { $unset : { "test1":1 } } );

> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test2" : "testv2", "test3" : "testv3", "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $unset : { "test2": 0 } } );

> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test3" : "testv3", "test4" : "testv4", "test5" : "OK" }

> db.test0. update( { "_id" : 15 } , { $unset : { "test3":asdfasf } } );

Fri May 14 16:17:38 JS Error: ReferenceError: asdfasf is not defined (shell):0 db.test0.update( { "_id" : 15 } , { $unset : { "test3":"test" } } );
> db.test0.find( { "_id" : 15 } );
{ " _id" : { "floatApprox" : 15 }, "count" : 18, "test4" : "testv4", "test5" : "OK" }

沒看出field : 1裡面的1是乾什麼用的,反正只要有東西就好。

4) $push
用法:{ $push : { field : value } }

把value追加到field裡面去,field一定要是數組類型才行,如果field不存在,會新增一個數組類型加進去。例:

> db.test0.update( { "_id" : 15 } , { $set : { "test1" : ["aaa","bbb"] } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test1": "ccc" } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test2": "ccc" } } );
> db.test0 .find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc" ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $push : { "test1 ": ["ddd","eee"] } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5 " : "OK" }
5) $pushAll

用法:{ $pushAll : { field : value_array } }

同$push,只是一次可以追加多個值到一個數組字段內。例:

> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", " bbb", "ccc", [ "ddd", "eee" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

> db.test0 .update( { "_id" : 15 } , { $pushAll : { "test1": ["fff","ggg"] } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "aaa", "bbb", "ccc", [ "ddd", "eee" ], "fff" , "ggg" ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }

6)$addToSet
用法:{ $addToSet : { field : value } }

增加一個值到數組內,而且只有當這個值不在數組內才會增加。例:
> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": {$each : ["444","555"] } } } );
> db.test0 .find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [
"aaa",
"bbb",
"ccc ",
[
"ddd",
"eee"
],
"fff",
"ggg",
[
"111",
"222"
],"4444", ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }
> db.test0.update( { "_id" : 15 } , { $addToSet : { " test1": {$each : ["444","555"] } } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
"fffggg",
" ",
[
"111",
"222"
],
"444",
"555"
], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }
> db.test0.update( { "_id" : 15 } , { $addToSet : { "test1": ["444","555"] } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [
"aaa",
"bbb",
"ccc",
"aaa",
"bbb",
"ccc",
"aaa",
"bbb",
"ccc",
"aaa",
"bbb",
"ccc",
"aaa",
"bbb",
"ccc",
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"
],
"fff",
"ggg",
[
"111",
"222"
],
"444",
"222"
],
"444",
"555"
"444",
"555"
]
], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }
> db.test0.update( { "_id " : 15 } , { $addToSet : { "test1": ["444","555"] } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [
"aaa",
"bbb",
"ccc",
[
"ddd",
"eee"

",

[
"ddd",

"eee"

]

" fff",

"ggg",
[
"111",

"222"

],
"444",
"555",
[
"444"
"555" " : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }


 7) $pop

刪除數組內的一個值

用法:
刪除最後一個值:{ $pop : { field : 1 } }
刪除第一個值:{ $pop : { field : -1 } }

注意,只能刪除一個值,也就是說只能用1或-1,而不能用2或-2來刪除兩條。 mongodb 1.1及以後的版本才可以用,例:
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, " test1" : [
"bbb",
"ccc",
[
"ddd",
"eee"
],
"fff",
"ggg",
[
"111"fff",
"ggg",[
"111" ],
"444"
], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }
> db.test0.update( { "_id" : 15 } , { $pop : { "test1": -1 } } );
> db.test0.find( { "_id" : 15 } );
{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [
"ccc",

[

"ddd",

"eee"

],

"fff",

"ggg",
[
"111",
",

" ,

"444"
], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }
> db.test0.update( { "_id" : 15 } , { $pop : { "test1": 1 } } );
> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18 , "test1" : [ "ccc", [ "ddd", "eee" ], "fff", "ggg", [ "111", "222" ] ], "test2" : [ "ccc" ], " test4" : "testv4",

"test5" : "OK" }

 8) $pull

用法:$pull : { field : value } }

從數組field內刪除一個等於value值。例:
> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ " ddd", "eee" ], "fff", "ggg", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4",

"test5" : "OK" }

> db.test0.update( { "_id" : 15 } , { $pull : { "test1": "ggg" } } );

> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ "ddd", "eee" ], "fff", [ "111 ", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5"
: "OK" }

 9) $pullAll

用法:{ $pullAll : { { field : value_array } }

同$pull,可以一次刪除數組內的多個值。例:

> db.test0.find( { "_id" : 15 } );

{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ "ccc", [ " ddd", "eee" ], "fff", [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5"
: "OK" }

🎜> db.test0.update( { "_id" : 15 } , { $pullAll : { "test1": [ "ccc" , "fff" ] } } );🎜> db.test0.find( { "_id " : 15 } );🎜{ "_id" : { "floatApprox" : 15 }, "count" : 18, "test1" : [ [ "ddd", "eee" ], [ "111", "222" ] ], "test2" : [ "ccc" ], "test4" : "testv4", "test5" : "OK" }🎜🎜🎜 10) $ 運算子🎜🎜$是他自己的意思,代表依條件找出的數組裡面某項他自己。 🎜> t.find()🎜{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe", "votes" : 3 }, { "by" : "jane", "votes" : 7 } ] }🎜🎜> t.update( {'comments.by':'joe'}, {$inc:{'comments.$.votes':1} }, false, true )🎜🎜> t.find()🎜{ "_id" : ObjectId("4b97e62bf1d8c7152c9ccb74"), "title" : "ABC", "comments" : [ { "by" : "joe" votes" : 4 }, { "by" : "jane", "votes" : 7 } ] }🎜

要注意的是,$只會套用找到的第一個數組項,後面的就不管了。還是看例子:

> t.find();
{ "_id" : ObjectId("4b9e4a1fc583fa1c76198319"), "x" : [ 1, 2, 3, 2 ] }
> t.update({x: 2, 3, 2 ] }
> t. }, {$inc: {"x.$": 1}}, false, true);

> t.find();


還有註意的是$配合$unset使用的時候,會留下一個null的數組項,不過可以用{$pull:{x:null}}刪除全部是null的陣列項。例:
> t.insert({x: [1,2,3,4,3,2,3,4]})
> t.find()
{ "_id" : ObjectId("4bde2ad3755d00000000710e"), "x" : [ 1, 2, 3, 4, 3, 2, 3, 4 ] }
> t.update({x:3}, {$unset:{"x.$":1}})
> t.find()

{ "_id" : ObjectId("4bde2ad3755d00000000710e"), "x" : [ 1, 2, null, 4, 3, 2, 3, 4 ] }🎜

{ "_id" : ObjectId("4b9e4a1fc583fa1c76198319"), "x" : [ 1, 3, 3, 2 ] }
Mongodb中索引的建立:
db.[表名]。 :-1})  num1與num2是建立索引的欄位
建立索引要考慮下列問題:
(1).會做什麼樣的查詢?其中那些鍵需要索引?
(2).每個鍵的索引方向是怎樣的?
(3).如何應對擴展?有沒有種不同的鍵的排列可以使常用資料保留在記憶體中。
db.[表名].ensureIndex({num1: 1,num2:-1},{“background”:true})//修改時間久的索引
db.runCommand({“dropIndexes“:“foo”, “index”:”alphabet”})
如果要刪除所有的索引,可以將index的值賦為* 。
Mongodb中的主從複製
主從複製可以用於資料庫備份、故障復原、讀取擴充等。 (目前還沒有能夠從節點複製的機制)。
1.運行mongod –master啟動主伺服器
2.運行mongod –slave –source master_address啟動從伺服器。 (master_address是主節點的位址)
3.給主節點建立目錄,並綁定連接埠(10000):
    $mkdir –p ~/dbs/master
    $ ./mongod –dbpath ~/dbs/master
    $ ./mongod –dbpath ~/dbs/master – 10000 –master
4.設定從節點目錄(選擇不同的目錄和連接埠)
    $mkdir –p ~/dbs/slave
    $ ./mongod –dbpath ~/dbs/slave –port 10001 –slave –source01 –slave
選項:-only(從節點上製定只複製特定某個資料庫)
     -slavedelay(用在從節點上,當應用主節點的操作時增加延遲)
     -fastsync(以主節點的資料快照為基礎啟動從節點,實施主從同步)
     -autoresync(自動恢復主從同步)
     -oplogSize(主節點oplog的大小單位MB)
三. Mongodb之GridFS
  因為mongodb蛀牙ishi支援海量資料儲存的,所以mongodb還自帶了一個分散式檔案系統GirdFS,可以支援海量的資料存儲,還有一點BSON文檔物件在mongodb中最大為4MB,放儲存大的對象。即使沒有大小限制BSON也無法滿足對大數據的快速範圍查詢,所以mongodb引進了GridFS。
四.  在 PHP 裡用程式碼進行測試:
與 MySQL 一樣,mongoDB 是以 PHP 擴充函式庫 .dll 的形式與 PHP 進行整合的。
到以下網址下載Windows 下對應PHP 版本的dll 檔案:
http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.windows
根據自己的PHP 的版本、是否執行緒安全(可在phpinfo 裡查看)等來選擇對應版本下載,解壓,得到php_mongo.dll 檔案。拷貝到 PHP 安裝目錄下的 ext 目錄下。在 php.ini 檔案裡加:extension = php_mongo.dll;
重啟 Web 伺服器(apache 或 nginx)。應該可以在 phpinfo 裡看到 mingoDB 的訊息,否則就是安裝有問題。很可能是下載的 mingoDB 擴充功能不對。
Php操作mongodb
1.與mongoDB建立連線:
直接實例化mongo類+建立連線:
$mo = new Mongo();//得到一個Mongo連線物件
實例化了一個Mongo類,並且與預設的localhost:27017連接埠的mongoDB建立連線。
如果想連接到其他的主機,可以這樣寫:
$mongo = new Mongo("mongodb://username:password@192.168.1.22:12345");
另外一種方式,實例化mongo類,再手動化mongo類,再手動化mongo類,再手動建立連線:
$mongo= newMongo("mongodb://username:password@192.168.1.22:12345",array('connect'=>false));//初始化類別
$mongo->connect();/ /建立連線
Mongo類別中有用的一些方法:
Mongo::listDBs()
傳回一個包含目前mongo服務上的函式庫(DB)資訊的陣列。
$mo = new Mongo();
$dbs = $mo->listDBs();//取得一個包含db資訊的陣列
Mongo::selectCollection($db,$coll)
回傳一個目前連接下的某db中的collection對象。
$mo = new Mongo();
$coll = $mo->selectCollection('db','mycoll');//得到一個collection物件
選擇想要的資料庫(Mongo類別):
一種方式:
$mongo = new Mongo();
$db = $mongo->foo;//得到一個MongoDB物件
另一種方式:
$mongo = new Mongo();
$db = $mongo->selectDB( 'foo');//得到一個MongoDB物件
MongoDB中有用的函數:
建立一個MongoDB物件
$mo = new Mongo();
$db = new MongoDB($mo,'dbname');//通過建立方式取得一個MongoDB物件
刪除目前DB
$db = $mo->dbname;
$db->drop();
取得目前資料庫名稱
$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->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;

'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);
傳回一個遊標記錄物件MongoCursor。


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn