一.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:{ < : 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。