初识MongoDB-用法和用途

用意:记录一下自己学习MongoDB的一些体会. 适合范围, 安装和用法. 

一. MongoDB相关

JavaScript统一天下
    JavaScript正在快节奏地统一整个web开发流程. JvaScript是WEB前端开发的唯一依靠, 依赖V8引擎的Node.js也正在划分服务器端的领地, 而数据库也是JavaScript垂涎已久的领域. MongoDB就是用类似JSON object格式存储数据的数据库.
    MongoDB的javascript shell很方便, 可以去在线尝试一下  http://try.mongodb.org/.
    关系型数据库到对象存储的转换一直是程序员头疼的工作. 而MongoDB直接返回JSON object的方式带来了很大的便利.
MongoDB适合领域
    特别适合存储 图片, 长文本等信息, 例如日志信息,  图片, 经纬度, 表单, 账号信息等. MongoDB可以作为分布式文件系统.
    通过 sharding实现负载均衡. 即数据集按某个字段切割到多个服务器上.
    动态scheme机制方便修改数据库, 快速上线修改应用. 
MongoDB缺点
    不适合多线程: 每次写操作都会锁住整个数据库. 
    管理类工具不丰富.
    数据库上限是100G

二. 安装MongoDB

    安装MongoDB有两种方式, 源码安装和package安装. 源码安装较简单.

2.1 package安装

2.1.1 配置源和工具
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
sudo apt-get update
sudo apt-get install mongodb-10gen
[注: 需要225M]
2.1.2 下载MongDB[最新稳定版本是2.4]
apt-get install mongodb-10gen=2.4.8
避免upgrade升级,使用pin
echo "mongodb-10gen hold" | sudo dpkg --set-selections
2.1.3 Mongo命令
启动MongDB:
sudo service mongodb start
是否启动成功,看日志:/var/log/mongodb/mongodb.log
停止MongDB:
sudo service mongodb stop
重启MongDB:
sudo service mongodb restart

2.1.4 MongDB文件结构介绍
启动文件:/etc/rc.d/init.d/mongod
配置文件:/etc/mongod.conf
data文件: /var/lib/mongo
log文件:/var/log/mongo
user账号:mongod user account

2.2 Linux源码安装方式

2.2.1 获得源码
下载安装包
curl -O http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz
解压缩包和创建目录
tar -zxvf mongodb-linux-x86_64-2.4.8.tgz
mkdir -p ~/mongodb
cp -R -n mongodb-linux-x86_64-2.4.8/ ~/mongodb

2.2.2 添加PATH
在~/.bashrc中
export PATH=~/mongodb/mongodb-linux-x86_64-2.4.8/bin:$PATH
[注意$符号,否则PATH就被识别为路径名了.]

2.2.3 添加数据库存储目录
创建mongdb用户
sudo useradd mongdb
设置data目录
mkdir -p /data/db
chown mongodb /data/db

2.2.4 MongoDB命令
启动mongoDB
mongod或者~/mongodb/mongodb-linux-x86_64-2.4.8/bin/mongod
mongod [--dbpath <some alternate directory>]
可以设置data路径
关闭mongoDB, control+C即可.

MongoDB shell:
     mongo或者~/mongodb/mongodb-linux-x86_64-2.4.8/bin/mongo
     mongo 等价于 mongo localhost:27017/admin

三. MongoDB使用

选择第二种安装方式, 因为第一种225M下载太痛苦了.

3.1 基本操作

3.1.1 选择数据库
    Mongo默认安装了三个数据集, foobar\local\test, 数据都在/data/db中.

显示所有数据集
show dbs
foobar 0.203125GB
local 0.078125GB
test 0.203125GB

显示当前连接数据集
db
test

创建数据集recommend
use recommend
switched to db recommend

万能的help命令可以显示常用的命令.

注: 使用show dbs后并没有发现recommend数据集. 只有插入数据后,才会真正创建recommend.
db.person.save({name: "Jimmy"});
show dbs
foobar 0.203125GB
local 0.078125GB
recommend 0.203125GB
test 0.203125GB

问题: 200M, 好大的空间啊? 具体存储了什么东西?

3.1.2 创建数据集
与Mysql的区别:Mysql建立数据集需要两个步骤:建立scheme和插入数据.
MongoDB采用动态scheme的方法,第一次插入数据时,scheme依据数据格式自动生成.
pref1 = {userid : 1, itemid : 12, rate : 3.0};
pref2 = {userid : 2, itemid : 30, rate : 5.0};
db.udata.insert(pref1);
db.udata.insert(pref2);

查看数据集, 显示插入成功:udata
show collections
person
system.indexes
udata

查看数据集udata数据: 
db.udata.find();
{ "_id" : ObjectId("527df58c3807dc04399c4bec"), "userid" : 1, "itemid" : 12, "rate" : 3 }
{ "_id" : ObjectId("527df58d3807dc04399c4bed"), "userid" : 2, "itemid" : 30, "rate" : 5 }

其中"_id"为系统自动生成.类似与MD5码?

3.1.3 插入更多的数据
for (var i = 3; i <= 25; i++) db.udata.insert({userid: Random.randInt(i) + 1, itemid : (Random.randInt(i) + 1)*3, rate : Random.randInt(6)});
db.udata.find();
{ "_id" : ObjectId("527df9153807dc04399c4c16"), "userid" : 9, "itemid" : 24, "rate" : 3 }
{ "_id" : ObjectId("527df9153807dc04399c4c17"), "userid" : 19, "itemid" : 36, "rate" : 1 }
{ "_id" : ObjectId("527df9153807dc04399c4c18"), "userid" : 12, "itemid" : 18, "rate" : 4 }

使用it可以显示更多的东西.

3.1.4 cursor查询数据
    两种查询方式: index和next()
3.1.4.1 index下标
var i = db.udata.find();
printjson(i[2]);
{
"_id" : ObjectId("527df9153807dc04399c4c07"),
"userid" : 4,
"itemid" : 9,
"rate" : 2
}
缺陷: 查询便捷, 但是所有数据加载到了数组中, 消耗大量内存.

3.1.4.2 next()方式
var c = db.udata.find();
while (c.hasNext()) { printjson(c.next()); }
或者
while (c.hasNext()) { print(c.next().userid);  }
5
9
8
优点: 查询无需加载整个数据到内存中.

3.1.5 查询操作
3.1.5.1 返回cursor
var a = db.udata.find({ userid : 18 }); printjson(a.next());
{
"_id" : ObjectId("527df9153807dc04399c4c19"),
"userid" : 18,
"itemid" : 51,
"rate" : 4
}

限定查询个数: 
db.udata.find({ rate : 1 }).limit(1);
{ "_id" : ObjectId("527df9153807dc04399c4c10"), "userid" : 7, "itemid" : 30, "rate" : 1 }
db.udata.find({ rate : 1 });
{ "_id" : ObjectId("527df9153807dc04399c4c10"), "userid" : 7, "itemid" : 30, "rate" : 1 }
{ "_id" : ObjectId("527df9153807dc04399c4c13"), "userid" : 9, "itemid" : 12, "rate" : 1 }
{ "_id" : ObjectId("527df9153807dc04399c4c17"), "userid" : 19, "itemid" : 36, "rate" : 1 }

3.1.5.2 返回document
var a = db.udata.findOne({ userid : 18 }); printjson(a);
{
"_id" : ObjectId("527df9153807dc04399c4c19"),
"userid" : 18,
"itemid" : 51,
"rate" : 4
}

3.2 db中选择数据集
var col = db.getSiblingDB("recommend").getCollection("udata");
col.find();
{ "_id" : ObjectId("527df9153807dc04399c4c05"), "userid" : 2, "itemid" : 3, "rate" : 4 }
{ "_id" : ObjectId("527df9153807dc04399c4c06"), "userid" : 3, "itemid" : 12, "rate" : 5 }
...

3.3 CRUD操作[增删改查]

官方文档的图解释的很清楚 http://docs.mongodb.org/manual/core/crud-introduction/ 
3.3.1 查询query


查询格式 : db.collections.find(select [, projection])[.limit()] 

找出所有用户19的preference
db.udata.find({userid:19}).limit(5);
{ "_id" : ObjectId("527df9153807dc04399c4c17"), "userid" : 19, "itemid" : 36, "rate" : 1 }
{ "_id" : ObjectId("527df9153807dc04399c4c1b"), "userid" : 19, "itemid" : 36, "rate" : 2 }

找出用户19中评分大于等于2的preference
db.udata.find({userid:19, rate:{$gte:2.0}}).limit(5);
{ "_id" : ObjectId("527df9153807dc04399c4c1b"), "userid" : 19, "itemid" : 36, "rate" : 2 }

找出用户19中评分小于3的preference,只显示itemid和userid
db.udata.find({userid:19, rate:{$lt:3.0}}, {itemid:1, userid:1}).limit(5);
{ "_id" : ObjectId("527df9153807dc04399c4c17"), "userid" : 19, "itemid" : 36 }
{ "_id" : ObjectId("527df9153807dc04399c4c1b"), "userid" : 19, "itemid" : 36 }

[select项比较特殊, select除_id外,只能全0或者全1; {itemid:1, userid:0}不允许]
{itemid:1, userid:1, _id:0}

此外sort很管用.
db.udata.find({userid: {$lt:8},rate:{$lt:3.0}}, {_id:0});
{ "userid" : 4, "itemid" : 9, "rate" : 2 }
{ "userid" : 4, "itemid" : 9, "rate" : 0 }
{ "userid" : 3, "itemid" : 18, "rate" : 2 }
{ "userid" : 5, "itemid" : 18, "rate" : 0 }
{ "userid" : 7, "itemid" : 30, "rate" : 1 }

db.udata.find({userid: {$lt:8},rate:{$lt:3.0}}, {_id:0}).sort({rate:1});
{ "userid" : 4, "itemid" : 9, "rate" : 0 }
{ "userid" : 5, "itemid" : 18, "rate" : 0 }
{ "userid" : 7, "itemid" : 30, "rate" : 1 }
{ "userid" : 4, "itemid" : 9, "rate" : 2 }
{ "userid" : 3, "itemid" : 18, "rate" : 2 }

3.3.1 增删改


插入操作
db.test.insert({age: 1});db.test.insert({age: 1});
db.test.find();
{ "_id" : ObjectId("527e18504afdfbe586145e4d"), "age" : 1 }
{ "_id" : ObjectId("527e18794afdfbe586145e4e"), "age" : 1 }

更新操作,只更新一个[好像是最新的]


db.test.update({age:1}, {$set: {name: "John"}});
db.test.find()
{ "_id" : ObjectId("527e18794afdfbe586145e4e"), "age" : 1 }
{ "_id" : ObjectId("527e18504afdfbe586145e4d"), "age" : 1, "name" : "John" }

更新多个
db.test.update({age:1}, {$set: {name: "Sam"}}, {multi:true});
db.test.find();
{ "_id" : ObjectId("527e18504afdfbe586145e4d"), "age" : 1, "name" : "Sam" }
{ "_id" : ObjectId("527e18794afdfbe586145e4e"), "age" : 1, "name" : "Sam" }

删除操作


db.test.insert({age: 2})
db.test.find()
{ "_id" : ObjectId("527e18794afdfbe586145e4e"), "age" : 1 }
{ "_id" : ObjectId("527e18504afdfbe586145e4d"), "age" : 1, "name" : "John" }
{ "_id" : ObjectId("527e19094afdfbe586145e4f"), "age" : 2 }
db.test.remove({age:2})
db.test.find()
{ "_id" : ObjectId("527e18794afdfbe586145e4e"), "age" : 1 }
{ "_id" : ObjectId("527e18504afdfbe586145e4d"), "age" : 1, "name" : "John" }

四. 参考资料

[1] http://www.fuchaoqun.com/2011/05/why-mongodb/
[2] MongoDB官方文档 http://docs.mongodb.org/manual/

转载于:https://my.oschina.net/Cfreedom/blog/201823

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值