首頁 後端開發 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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

net4.0有什麼用 net4.0有什麼用 May 10, 2024 am 01:09 AM

.NET 4.0 用於創建各種應用程序,它為應用程式開發人員提供了豐富的功能,包括:物件導向程式設計、靈活性、強大的架構、雲端運算整合、效能最佳化、廣泛的程式庫、安全性、可擴展性、資料存取和行動開發支援。

如何在Debian上配置MongoDB自動擴容 如何在Debian上配置MongoDB自動擴容 Apr 02, 2025 am 07:36 AM

本文介紹如何在Debian系統上配置MongoDB實現自動擴容,主要步驟包括MongoDB副本集的設置和磁盤空間監控。一、MongoDB安裝首先,確保已在Debian系統上安裝MongoDB。使用以下命令安裝:sudoaptupdatesudoaptinstall-ymongodb-org二、配置MongoDB副本集MongoDB副本集確保高可用性和數據冗餘,是實現自動擴容的基礎。啟動MongoDB服務:sudosystemctlstartmongodsudosys

使用 Composer 解決推薦系統的困境:andres-montanez/recommendations-bundle 的實踐 使用 Composer 解決推薦系統的困境:andres-montanez/recommendations-bundle 的實踐 Apr 18, 2025 am 11:48 AM

在開發一個電商網站時,我遇到了一個棘手的問題:如何為用戶提供個性化的商品推薦。最初,我嘗試了一些簡單的推薦算法,但效果並不理想,用戶的滿意度也因此受到影響。為了提升推薦系統的精度和效率,我決定採用更專業的解決方案。最終,我通過Composer安裝了andres-montanez/recommendations-bundle,這不僅解決了我的問題,還大大提升了推薦系統的性能。可以通過一下地址學習composer:學習地址

MongoDB在Debian上的高可用性如何保障 MongoDB在Debian上的高可用性如何保障 Apr 02, 2025 am 07:21 AM

本文介紹如何在Debian系統上構建高可用性的MongoDB數據庫。我們將探討多種方法,確保數據安全和服務持續運行。關鍵策略:副本集(ReplicaSet):利用副本集實現數據冗餘和自動故障轉移。當主節點出現故障時,副本集會自動選舉新的主節點,保證服務的持續可用性。數據備份與恢復:定期使用mongodump命令進行數據庫備份,並製定有效的恢復策略,以應對數據丟失風險。監控與報警:部署監控工具(如Prometheus、Grafana)實時監控MongoDB的運行狀態,並

Navicat查看MongoDB數據庫密碼的方法 Navicat查看MongoDB數據庫密碼的方法 Apr 08, 2025 pm 09:39 PM

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

CentOS MongoDB備份策略是什麼 CentOS MongoDB備份策略是什麼 Apr 14, 2025 pm 04:51 PM

CentOS系統下MongoDB高效備份策略詳解本文將詳細介紹在CentOS系統上實施MongoDB備份的多種策略,以確保數據安全和業務連續性。我們將涵蓋手動備份、定時備份、自動化腳本備份以及Docker容器環境下的備份方法,並提供備份文件管理的最佳實踐。手動備份:利用mongodump命令進行手動全量備份,例如:mongodump-hlocalhost:27017-u用戶名-p密碼-d數據庫名稱-o/備份目錄此命令會將指定數據庫的數據及元數據導出到指定的備份目錄。

CentOS上GitLab的數據庫如何選擇 CentOS上GitLab的數據庫如何選擇 Apr 14, 2025 pm 04:48 PM

CentOS系統上GitLab數據庫部署指南選擇合適的數據庫是成功部署GitLab的關鍵步驟。 GitLab兼容多種數據庫,包括MySQL、PostgreSQL和MongoDB。本文將詳細介紹如何選擇並配置這些數據庫。數據庫選擇建議MySQL:一款廣泛應用的關係型數據庫管理系統(RDBMS),性能穩定,適用於大多數GitLab部署場景。 PostgreSQL:功能強大的開源RDBMS,支持複雜查詢和高級特性,適合處理大型數據集。 MongoDB:流行的NoSQL數據庫,擅長處理海

Pi幣重大更新:Pi Bank要來了! Pi幣重大更新:Pi Bank要來了! Mar 03, 2025 pm 06:18 PM

PiNetwork即將推出革命性移動銀行平台PiBank! PiNetwork今日發布重大更新Elmahrosa(Face)PIMISRBank,簡稱PiBank,它將傳統銀行服務與PiNetwork加密貨幣功能完美融合,實現法幣與加密貨幣的原子交換(支持美元、歐元、印尼盾等法幣與PiCoin、USDT、USDC等加密貨幣的互換)。究竟PiBank有何魅力?讓我們一探究竟! PiBank主要功能:一站式管理銀行賬戶和加密貨幣資產。支持實時交易,並採用生物特

See all articles