MongoDB笔记
[*]
安装配置
Windows安装:
Mongo数据模型
01
一个Mongo系统(参考上述部署)包含一组数据库
02
一个 database 包含一组collection
03
一个 collection 包含一组document
04
一个 document 是一组field
05
一个 field 是一对key-value
06
一个 key 是一个名字(字符串)
07
一个 value 可以是一个
08
基本类型,如字符串,整数,浮点数,时间戳,二进制等等
09
document
10
value的数组
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下的文件列表如下
01
c:\mongoDB\bin 的目录
02
03
2011/09/0614:26 .
04
2011/09/0614:26 ..
05
2011/08/3102:06 4,692,480 bsondump.exe
06
2011/08/3102:09 2,347,008 mongo.exe
07
2011/08/3102:14 5,054,464 mongod.exe
08
2011/08/3102:17 4,709,888 mongodump.exe
09
2011/08/3102:19 4,696,576 mongoexport.exe
10
2011/08/3102:22 4,714,496 mongofiles.exe
11
2011/08/3102:24 4,734,464 mongoimport.exe
12
2011/08/3102:27 4,705,792 mongorestore.exe
13
2011/08/3102:29 3,448,832 mongos.exe
14
2011/08/3102:31 4,774,400 mongostat.exe
3、在c:\mongodb下新建文件夹data
1
mkdir c:\mongodb\data
4、启动mongodb
01
c:\mongoDB\bin>mongod -dbpath c:\mongodb\data
02
Tue Sep 06 16:02:06 MongoDB starting : pid=452 port=27017 dbpath
03
=c:\mongodb\data 64-bit
04
Tue Sep 06 16:02:06 db version v1.8.4-pre-, pdfile version 4.5
05
Tue Sep 06 16:02:06 git version: f3bd113e0df642703fda8cc9fe7f6cd
06
f6503e5e8
07
Tue Sep 06 16:02:06 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 waiting for connections on port 27017
10
Tue Sep 06 16:02:06 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
09
},
10
{
11
"comment" : "i thought it was too short",
12
"author" : "Claire",
13
"votes" : 3
14
},
15
{
16
"comment" : "free watches",
17
"author" : "Alice",
18
"votes" : -1
19
}]
20
}
我们现在想要更新第一个名为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
5
do_something(ps)
对于,这三种操作: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" 这四个分别代表 =,它们是用来设置查询范围的,比如
1
db.users.find({"age" : {"$gte" : 18, "$lte" : 30}}) #找出年龄在18
页:
[1]