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

MongoDB在php用法

Nov 09, 2016 pm 02:00 PM
mongodb

一. 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
使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

您如何防止與會議有關的跨站點腳本(XSS)攻擊?您如何防止與會議有關的跨站點腳本(XSS)攻擊?Apr 23, 2025 am 12:16 AM

要保護應用免受與會話相關的XSS攻擊,需採取以下措施:1.設置HttpOnly和Secure標誌保護會話cookie。 2.對所有用戶輸入進行輸出編碼。 3.實施內容安全策略(CSP)限制腳本來源。通過這些策略,可以有效防護會話相關的XSS攻擊,確保用戶數據安全。

您如何優化PHP會話性能?您如何優化PHP會話性能?Apr 23, 2025 am 12:13 AM

优化PHP会话性能的方法包括:1.延迟会话启动,2.使用数据库存储会话,3.压缩会话数据,4.管理会话生命周期,5.实现会话共享。这些策略能显著提升应用在高并发环境下的效率。

什麼是session.gc_maxlifetime配置設置?什麼是session.gc_maxlifetime配置設置?Apr 23, 2025 am 12:10 AM

theSession.gc_maxlifetimesettinginphpdeterminesthelifespanofsessiondata,setInSeconds.1)它'sconfiguredinphp.iniorviaini_set().2)abalanceisesneededeededeedeedeededto toavoidperformance andunununununexpectedLogOgouts.3)

您如何在PHP中配置會話名?您如何在PHP中配置會話名?Apr 23, 2025 am 12:08 AM

在PHP中,可以使用session_name()函數配置會話名稱。具體步驟如下:1.使用session_name()函數設置會話名稱,例如session_name("my_session")。 2.在設置會話名稱後,調用session_start()啟動會話。配置會話名稱可以避免多應用間的會話數據衝突,並增強安全性,但需注意會話名稱的唯一性、安全性、長度和設置時機。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),