`
erntoo
  • 浏览: 30144 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论
  • erntoo: 修改somaxconn该内核参数默认值一般是128,对于负载很 ...
    rpm

MongoDB在php用法

阅读更多
一.Mongodb的基本概念
1. Mongodb数据库的命名规则:
不能是空字符串(“”)
不得含有‘’(空格)、.、$、/、\、和\0(空字符)
应全部小写
最多64字节
2. Mongodb数据库的安装和启动
在windows上安装与启动:
    第一步.先下载适用windows的最新mongodb版本的稳定产品。
    第二步.把压缩文件解压到自己指定的文件夹(或D:\),为了方便,将解压后的文件夹重命名为mongodb,然后在D盘根文件夹下建一个mongo文件夹。
    第三步.启动mongodb服务器,执行如下操作
    打开命令提示符窗口 (启动 > 运行 >,输入 cmd 并按 确定),
    C:\Documents and Settings\Administrator>d:(指向D盘)
    D:\>cd mongod(指向D盘下的mongodb文件夹)
    D:\mongodb>cd bin(指向mongodb文件夹下的bin文件夹)
    D:\mongodb\bin>mongod -dbpath d://mongo(指定数据库的存放文件夹)
    然后出现:
Wed Oct 19 09:38:16 MongoDB starting : pid=1064 port=27017 dbpath=d://mongo 32-bit
** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
** see http://blog.mongodb.org/post/137788967/32-bit-limitations
Wed Oct 19 09:38:16 db version v1.6.5, pdfile version 4.5
Wed Oct 19 09:38:16 git version: 0eb017e9b2828155a67c5612183337b89e12e291
Wed Oct 19 09:38:16 sys info: windows (5, 1, 2600, 2, 'Service Pack 3') BOOST_LI
B_VERSION=1_35
Wed Oct 19 09:38:16 [initandlisten] waiting for connections on port 27017
Wed Oct 19 09:38:16 [websvr] web admin interface listening on port 28017
Wed Oct 19 09:39:45 [initandlisten] connection accepted from 127.0.0.1:6819 #1
至此Mongodb服务器启动成功。
(注:启动mongodb服务器以后,切不可关闭dos窗口,否则服务器会自动关闭)
    第四步.启动shell。
    重新打开一个dos窗口,输入
    C:\Documents and Settings\Administrator>d:
D:\>cd mongodb
D:\mongodb>cd bin
D:\mongodb\bin>mongo
另一种方法是,在 Windows 资源管理器中导航至 C:\mongo\bin 并双击 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
$ tar xzf mongo.tgz 如果没有安装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
mymongo
test
>
iii.  show collections 查看当前数据库下所有的表
> 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: {
...         name: "Joe Bloggs",
...         company: "XYZ Inc.",
...         phone: "(555) 123-4567"
...     },
...     payment: {
...         type: "Cash",
...         amount: 4075.99,
...         paid_in_full: true
...     },
...     items: [
...         {
...             sku: "ABC1200",
...             description: "A sample product",
...             quantity: 1,
...             price_per_unit: 75.99,
...         }, {
...             sku: "XYZ3400",
...             description: "An expensive product",
...             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" }
{ "_id" : ObjectId("4e9bc2374fadb58af17b2f02"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2384fadb58af17b2f03"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2394fadb58af17b2f04"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2394fadb58af17b2f05"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23a4fadb58af17b2f06"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23a4fadb58af17b2f07"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f08"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f09"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0a"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0b"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23d4fadb58af17b2f0c"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9e3f435240000000005a2d"), "color" : "112233" }
删除添加的那条记录
> db.colors.remove({"color":"112233"})
> db.colors.find()
{ "_id" : ObjectId("4e9bc2024fadb58af17b2f01"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2374fadb58af17b2f02"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2384fadb58af17b2f03"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2394fadb58af17b2f04"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc2394fadb58af17b2f05"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23a4fadb58af17b2f06"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23a4fadb58af17b2f07"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f08"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23b4fadb58af17b2f09"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0a"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23c4fadb58af17b2f0b"), "color" : "ff0000" }
{ "_id" : ObjectId("4e9bc23d4fadb58af17b2f0c"), "color" : "ff0000" }
f)  update指令
i.  修改数据
ii.  db.[表名].update()
db.collection.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:{ &lt : num }]})中括号中为查询条件示例,大于小于等关系运算符则使用转译字符代替。
> use zm
switched to db zm
> db.zm.find().skip(10).limit(5);
{ "_id" : ObjectId("4e9e3d6b5240000000005a1c"), "char" : "k", "code" : 107 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1d"), "char" : "l", "code" : 108 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1e"), "char" : "m", "code" : 109 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1f"), "char" : "n", "code" : 110 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a20"), "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", "code" : 97 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a13"), "char" : "b", "code" : 98 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a14"), "char" : "c", "code" : 99 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a19"), "char" : "h", "code" : 104 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1a"), "char" : "i", "code" : 105 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1b"), "char" : "j", "code" : 106 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1c"), "char" : "k", "code" : 107 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1d"), "char" : "l", "code" : 108 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1e"), "char" : "m", "code" : 109 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a1f"), "char" : "n", "code" : 110 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a20"), "char" : "o", "code" : 111 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a21"), "char" : "p", "code" : 112 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a22"), "char" : "q", "code" : 113 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a23"), "char" : "r", "code" : 114 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a24"), "char" : "s", "code" : 115 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a25"), "char" : "t", "code" : 116 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a26"), "char" : "u", "code" : 117 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a27"), "char" : "v", "code" : 118 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a28"), "char" : "w", "code" : 119 }
{ "_id" : ObjectId("4e9e3d6b5240000000005a29"), "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.  >use 数据库名
switched to do admin
>db.shutdownServer();
server should be down…
MongoDB 支持各种条件运算符,包括:
?  $lt (小于)
?  $lte (小于等于)
?  $gt (大于)
?  $gte (大于等于)
?  $all (匹配数组中的所有值)
?  $exists (检查字段是否存在)
?  $mod (模数)
?  $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 } }
就是相当于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"
],
"444",
"555"
], "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"
],
"fff",
"ggg",
[
"111",
"222"
],
"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"
],
"fff",
"ggg",
[
"111",
"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"
],
"fff",
"ggg",
[
"111",
"222"
],
"444",
"555",
[
"444",
"555"
]
], "test2" : [ "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",
"222"
],
"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"
],
"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}, {$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.[表名].ensureIndex({num1: 1,num2:-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 –port 10000 –master
4.设置从节点目录(选择不同的目录和端口)
    $mkdir –p ~/dbs/slave
    $ ./mongod –dbpath ~/dbs/slave –port 10001 –slave –source
    localhost:10000
选项:-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= 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;
$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);
返回一个游标记录对象MongoCursor。
分享到:
评论

相关推荐

    php操作MongoDB使用说明

    在PHP中操作MongoDB数据库主要依赖于PHP的MongoDB扩展。MongoDB是一个基于分布式文件存储的NoSQL数据库系统,适合处理大量数据并提供高可用性和高性能。本文将详细介绍如何使用PHP连接MongoDB、选择数据库、操作集合...

    mongodb和php的用法详解

    MongoDB和PHP的整合使用详解 MongoDB是一种面向文档的NoSQL数据库管理系统,以其高性能、高可用性和易扩展的特点被广泛应用于各种...掌握MongoDB和PHP的整合使用方法,对于任何Web开发者来说都是一项重要的技能。

    PHP操作MONGODB详细文档 WORD版

    在IT行业中,数据库管理和开发是至关重要的技能,尤其是在大数据时代,NoSQL数据库如...通过阅读和实践,开发者不仅可以掌握基本的数据库操作,还能深入理解MongoDB的特性和PHP扩展的用法,从而在项目开发中游刃有余。

    mongodb-php5.3.3-1.6.12.zip

    MongoDB 是一个高性能、分布式、开源的文档型数据库系统,主要设计用于处理海量数据,并且在灵活性和可扩展性方面表现出色...使用这个扩展,开发者可以轻松地在PHP应用中集成MongoDB,实现高效、灵活的数据管理和处理。

    mongodb-php5.6-mongo1.6.12.zip

    这意味着开发人员可以放心在基于CentOS的系统上部署和使用这个扩展来连接和管理MongoDB数据库。 MongoDB PHP驱动的安装步骤通常包括以下几个关键点: 1. **下载和解压**:首先,你需要下载这个zip文件,然后在...

    MongoDB PHP查找文档.pdf

    PHP是广泛使用的服务器端编程语言,MongoDB的PHP驱动程序使得在PHP中与MongoDB进行交互变得简单。本文将深入探讨如何使用PHP进行MongoDB文档的查找操作。 首先,要连接到MongoDB数据库,你需要创建一个新的`...

    php+mongodb小型留言板

    在本项目中,“php+mongodb小型留言板”是一个适合初学者的实践项目,旨在帮助学习者掌握MongoDB数据库的使用,并通过PHP进行数据交互。MongoDB是一种NoSQL文档型数据库,以其灵活性、高性能和高可扩展性著称。而PHP...

    很全的_Mongodb数据库学习文档_与_php操作mongodb

    - **连接MongoDB**:在PHP中使用MongoDB前,需确保已安装并启用`mongodb`扩展。通过`MongoDB\Client`类实例化客户端对象,指定主机和端口进行连接。 - **执行CRUD操作**:利用MongoDB提供的丰富的API,开发者可以...

    php MongoDB for CI

    在本文中,我们将深入探讨如何在CodeIgniter(CI)框架中使用PHP与MongoDB进行集成,以便在Web开发项目中充分利用NoSQL数据库的优势。"php MongoDB for CI" 是一个针对CI框架的MongoDB扩展,它提供了一种简单且高效...

    php操作mongodb详解

    在PHP中操作MongoDB是一种常见的任务,MongoDB是一种流行的NoSQL数据库,它以JSON格式存储数据,适合处理大量非结构化或半结构化数据。PHP的MongoDB扩展提供了一种简单的方式来与MongoDB交互。以下是关于如何使用PHP...

    php_mongodb-1.2.9-7.1-nts-vc14-x86

    5. `README.md`:一般包含扩展的安装指南、使用方法、注意事项等,是理解如何在项目中启用和利用这个扩展的关键。 6. `php_mongodb.pdb`:这是程序数据库文件,用于在开发过程中调试代码。在生产环境中,这个文件...

    php封装的mongodb操作类.zip

    在IT行业中,数据库管理系统起着至关重要的作用,而MongoDB作为一个流行的NoSQL数据库,因其非关系型、灵活性和高性能的特点,被广泛应用于大数据处理、实时分析等场景。PHP作为服务器端脚本语言,与MongoDB的结合...

    php_mongodb.dll php 7.0下载

    因此,对于PHP 7.0及更高版本,需要使用更新的`mongodb`扩展,即`php_mongodb.dll`,它提供了与MongoDB服务器通信的接口,使得开发者可以在PHP中执行查询、插入、更新和删除等操作。 **`php_mongodb.dll`详解** `...

    php结合mongodb判断坐标是否在指定多边形区域内的实例

    2. 创建或获取2dsphere索引:使用`createIndex()`方法在集合上创建一个2dsphere索引,这将使MongoDB能够高效地处理地理位置查询。 3. 插入多边形数据:如果需要,你可以将多边形数据插入到集合中,这样它们就可以被...

    Thinkphp使用mongodb数据库实现多条件查询方法

    在Thinkphp中实现多条件查询时,可以使用框架提供的查询构建器(Query Builder),但是当涉及到MongoDB的复合查询时,比如需要使用AND和OR逻辑运算符进行多条件筛选,官方文档中提供的方法可能不足以满足需求。...

    PHP操作MONGODB详细文档

    本文档详细介绍了 PHP 操作 MongoDB 的方法,包括 MongoDB 的启动、关闭、添加用户和权限验证等内容。 一、 MongoDB 的启动 MongoDB 的启动可以通过命令行方式启动,使用可执行文件 mongod,mongod 有很多的启动...

    mongodb驱动PHP版

    在使用MongoDB PHP驱动之前,开发者需要了解一些基本概念,如MongoDB的数据模型,其中文档(Document)相当于关系数据库中的行,集合(Collection)相当于表,数据库(Database)是存储数据的地方。驱动提供了丰富的...

    mongodb-1.6.0.tgz php扩展

    5. 在PHP代码中引入所需的类和方法,开始进行MongoDB的数据库操作。 了解并熟练掌握MongoDB的PHP扩展是开发基于MongoDB的PHP应用的关键,它极大地简化了数据操作,使得PHP开发者能充分利用MongoDB的灵活性和高性能...

    mongodb driver 集成mongo和mongodb扩展 log.php 发送日志类

    在这个目录下,你可能会找到关于如何配置和使用MongoDB Driver以及log.php类的代码示例。通过分析这些文件,开发者可以学习如何建立数据库连接,执行CRUD操作,以及如何通过log.php类记录和处理日志信息。 在实际...

    拓展配置php环境下的mongoDb的数据库文件v5.4-5.6

    - 在PHP代码中,使用`new MongoClient()`来创建一个新的MongoDB连接。例如: ```php $mongo = new MongoClient(); ``` - 你可以指定服务器地址和端口,例如:`$mongo = new MongoClient("mongodb://localhost:...

Global site tag (gtag.js) - Google Analytics