|
Windows安装:
Mongo数据模型
01
| 一个Mongo系统(参考上述部署)包含一组数据库
| 02
| 一个 database 包含一组collection
|
03
| 一个 collection 包含一组document
| 04
| 一个 document 是一组field
|
05
| 一个 field 是一对key-value
| 06
| 一个 key 是一个名字(字符串)
|
07
| 一个 value 可以是一个
| 08
| 基本类型,如字符串,整数,浮点数,时间戳,二进制等等
|
1、下载 MongoDB
MongoDB官网下载地址:http://www.mongodb.org/downloads 我下载的是Nightly(latest & stable)
2、在C盘新建目录mongoDB,并把刚才下的Zip包中的bin解压到新建的mongoDB 中。
1
| mkdir c:\mongodb
| 2
| mkdir c:\mongodb\bin
| bin下的文件列表如下
03
| 2011/09/06 14:26 .
| 04
| 2011/09/06 14:26 ..
|
05
| 2011/08/31 02:06 4,692,480 bsondump.exe
| 06
| 2011/08/31 02:09 2,347,008 mongo.exe
|
07
| 2011/08/31 02:14 5,054,464 mongod.exe
| 08
| 2011/08/31 02:17 4,709,888 mongodump.exe
|
09
| 2011/08/31 02:19 4,696,576 mongoexport.exe
| 10
| 2011/08/31 02:22 4,714,496 mongofiles.exe
|
11
| 2011/08/31 02:24 4,734,464 mongoimport.exe
| 12
| 2011/08/31 02:27 4,705,792 mongorestore.exe
|
13
| 2011/08/31 02:29 3,448,832 mongos.exe
| 14
| 2011/08/31 02:31 4,774,400 mongostat.exe
| 3、在c:\mongodb下新建文件夹data
4、启动mongodb
01
| c:\mongoDB\bin>mongod -dbpath c:\mongodb\data
| 02
| Tue Sep 06 16:02:06 [initandlisten] MongoDB starting : pid=452 port=27017 dbpath
|
03
| =c:\mongodb\data 64-bit
| 04
| Tue Sep 06 16:02:06 [initandlisten] db version v1.8.4-pre-, pdfile version 4.5
|
05
| Tue Sep 06 16:02:06 [initandlisten] git version: f3bd113e0df642703fda8cc9fe7f6cd
| 06
| f6503e5e8
|
07
| Tue Sep 06 16:02:06 [initandlisten] build sys info: windows (6, 1, 7601, 2, 'Ser
| 08
| vice Pack 1') BOOST_LIB_VERSION=1_42
|
09
| Tue Sep 06 16:02:06 [initandlisten] waiting for connections on port 27017
| 10
| Tue Sep 06 16:02:06 [websvr] web admin interface listening on port 28017
| 嗯 MongoDB已经起了。
Linux安装:
先去MongoDB的官方下载http://www.mongodb.org/downloads,我这里下的是LINUX 32-BIT 1.8.2的版本。
下完文件名为mongodb-linux-i686-1.8.2.tgz
解压 tar xzvf mongodb-linux-i686-1.8.2.tgz
得到文件夹mongodb-linux-i686-1.8.2,把这个文件移动到$HOME目录下,然后设置PATH
不知道HOME目录是什么就在Terminal里 echo $HOME你就知道了
在$HOME目录下建个.bashrc文件,写入如下配置
export MONGODB_HOME=/home/castiel/mongodb-linux-i686-1.8.2
export PATH=$MONGODB_HOME/bin:$PATH
好了,现在再建个目录作为保存我们数据库的地方
我还是建在$HOME目录下,名字叫mongodatabase
现在我们启动Mongodb的服务,在Terminal里输入
mongod -dbpath /home/castiel/mongodatabse
后面的参数指定了我们刚新建的文件夹作为存放数据库的地方
现在服务应该跑起来了,再开个Terminal,输入mongo,就进入mongodb的shell交互界面
如果到此一切成功,那么基础环境就算是搞定了。
Mongodb中有document,collection,database
关系为database里有多个collection,每个collection里有多个document
document就是以key-value的形式存放的,value也可以是document
在shell里,db代表当前所使用的数据库,
1
| show dbs #显示所有数据库
| 2
| db.version() #显示Mongodb的版本号
| 以下"collection"代表任意collection
db.collection.update #mongodb的update是atomic,假如有两个人同时update同一个数据,两个都会生效,数据的状态是最后update的状态(last update win)
db.collection.remove #不加参数则全部删除,但保留index
1
| x = db.collection.findOne()
| 2
| x.num = 42
|
3
| db.collection.save(x) #shell中一种比用update来更新的更好办法
| db.drop_collection("name_of_collection") #彻底删除
db.collection.insert() #插入document
update里用的modifier
$set #用来设置一个document,如不存在则创建该document
1
| {"$set" : {"author.name" : "joe schmoe"}}
| $unset #用来删除一个document
$inc #用来增加一个document的value部分,value必需是数字。如不存在则创建该document
1
| {"$inc" : {"score" : 10000}}
| $push #用来向一个document的value部分,以数组的方式
1
| {$push : {"comments" :{"name" : "joe", "email" : "joe@example.com", "content" : "nice post."}}
| $ne #与$push配合使用,不存在存会添加,存在就不会添加
1
| {"authors cited" : {"$ne" : "Richie"}}, {$push : {"authors cited" : "Richie"}}
| $addToSet #同上,但是是单独使用的.有的时候你不确定某个document到底存不存在,用这个就不会造成数据的重复
1
| {"$addToSet" : {"emails" : "joe@hotmail.com"}}
| $each #与$addToSet配合使用,添加数组
1
| {"$addToSet" :{"emails" : {"$each" : ["joe@php.net","joe@example.com","joe@python.org"]}}
| $pop #像栈一样删除,随便从哪头开始
1
| {$pop : {key : 1}}
| 2
| {$pop : {key : -1}}
| $pull #根据所给的KEY删除指定的document,假如有多个KEY匹配,则删除多个document
1
| {"$pull" : {"todo" : "laundry"}}
| 假如有下面这样的一个docment
01
| {
| 02
| "_id" : ObjectId("4b329a216cc613d5ee930192"),
|
03
| "content" : "...",
| 04
| "comments" : [
|
05
| {
| 06
| "comment" : "good post",
|
07
| "author" : "John",
| 08
| "votes" : 0
|
11
| "comment" : "i thought it was too short",
| 12
| "author" : "Claire",
|
15
| {
| 16
| "comment" : "free watches",
|
17
| "author" : "Alice",
| 18
| "votes" : -1
|
我们现在想要更新第一个名为good post的comments的votes,可以这样做
1
| db.blog.update({"post" : post_id}, {"$inc" : {"comments.0.votes" : 1}}) #看见没,可以像操作数组一样,多方便啊
| 现在我们来把这个comment的author由John改成Jim,但如果这个时候我不知道John是在数组里的第几个,即我不知道index,这个时候可以用$,即原来用index的地主改成$,就像下面这样
1
| db.blog.update({"comments.author" : "John"},{"$set" : {"comments.$.author" : "Jim"}})
| update还有另一种形式,就是其第三个参数设置为true,使之成为一个upsert
1
| db.analytics.update({"url" : "/blog"}, {"$inc" : {"visits" : 1}}, true)
| 上面的update包含了两个意思,以{url : "/blog"}进行查询,成功找到就更新,没有找到就创建
这样我们就不用自己写代码来判断存在或是不存在的情况了
update默认情况下只会更新第一个匹配的到的数据,如果要更新所有都匹配的数据,只要把它的第四个参数也设置为true就行
用findAndModify可以解决多线程争用问题,不知道这词用的对不对,反正自己明白就好了
用在update上
1
| ps = db.runCommand({"findAndModify" : "processes",
| 2
| "query" : {"status" : "READY"},
|
3
| "sort" : {"priority" : -1},
| 4
| "update" : {"$set" : {"status" : "RUNNING"}}).value
|
5
| do_something(ps)
| 6
| db.process.update({"_id" : ps._id}, {"$set" : {"status" : "DONE"}})
| 可以用在remove上
1
| ps = db.runCommand({"findAndModify" : "processes",
| 2
| "query" : {"status" : "READY"},
|
3
| "sort" : {"priority" : -1},
| 4
| "remove" : true).value
|
对于,这三种操作:insert,remove,update,这三种速度都很快,因为他们都是fire-and-forget类型的操作,即不用等待服务器作出response,就马上可以进行下一步操作。
那也许你就会问,我都不能确定服务器收到了我的数据,那怎么办,其实是有办法的,现在我还没有看到而已。
1
| db.users.find({}, {"username" : 1, "email" : 1})
| 上面代码的意思是找到USERS里所有的数据里的username和email这两种KEY所对应的数据。
USERS里可能还有其它的key比如:gender,address什么的,但某些情况下我们只需要其中的一部分。
每次用find或是findOne的时候,它总是会返回_id这个key-value,不想让它返回这个怎么办,这样做
1
| db.users.find({}, {"username" : 1, "_id" : 0}) #这时候就只会返回username了,不会返回_id了
| "$lt", "$lte", "$gt", "$gte" 这四个分别代表 =,它们是用来设置查询范围的,比如
[table][tr][td] 1
[/td][td] db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) #找出年龄在18 |
|