MongoDB - 文档数据库¶
MongoDB 是一个开源的跨平台的文档数据库,属于 NoSQL 数据库分类。MongoDB 避开了传统的关系型数据库结构,使用类JSON的动态文档,使得数据的整合更快更简单。 [1]
主要功能¶
- 面向文档
与存储标题和作者在两个关系型结构中不同,在 MongoDB 中可以把标题,作者和其他标题相关的信息都存储在一个名为Book中的单个文件。
- 指定查询
MongoDB 支持通过字段,范围,正则表达式查询。查询可以返回的文档的特定字段,并且还包括用户定义的JavaScript函数。
- 索引
MongoDB 文件中的所有字段都可以索引
- 复制
MongoDB 提供了高可用的复制,一个复制集包含两个或多个数据副本。 每个副本可以在任何时间成为主副本或者从副本。主副本提供读和写,从副本保持从主副本复制数据。当主副本下线,从副本将自动成为主副本。
- 负载均衡
MongoDB 可以运行在多个服务器,负载均衡和复制数据,保证系统启动并在出现硬件故障时运行。
- 文件存储
MongoDB 可以作为一个文件系统使用,有利于负载均衡和数据复制。这个功能,称为 GridFS,被包含在MongoDB 驱动中。
安装¶
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.0 main" >> /etc/apt/sources.list.d/mongodb-org-3.0.list
apt-get update
apt-get install mongodb-org
配置¶
- /etc/mongod.conf mongoDB的配置文件
- /var/lib/mongodb 数据文件
- /var/log/mongodb 日志文件
入门知识¶
- 文档
文档是 MongoDB 中数据的基本单元,非常类似于关系数据库中的行。 文档是键值对的一个有序集,键是字符串,值可以是多种不同的数据类型。 文档必须有一个 _id 键。键的值默认是ObjectId类型
- 集合
集合是一组文档,相当于表。在一个集合里面,文档的 _id 是唯一的。
- 数据库
多个集合组成数据库
CRUD 操作¶
- 插入
db.test.insert({“”:}) 插入的数据必须小于16M
- 删除
db.test.remove({“”:}) emove函数接受键值参数作为删除条件
更新
$set
$set 用来更新一个键的值,如果键不存在,则创建。 db.blog.update({“_id”:ObjectId(“5603697db13466f29ba8e673”)},{“$set”:{“fa”:”War and peace”,”wow”:”lol”}})
$unset
$unset 用来清除一个键值 db.blog.update({“_id”:ObjectId(“5603697db13466f29ba8e673”)},{“$unset”:{“fa”:1}})
$inc
$inc 用来增加一个键的值,如果键不存在,则创建。 db.blog.update({“_id”:ObjectId(“5603697db13466f29ba8e673”)},{“$inc”:{“fa”:55}})
upsert
将 update 的第三个参数设置为 true upsert 可以避免竟态问题 db.blog.update({“_id”:ObjectId(“5603697db13466f29ba8e673”)},{“$inc”:{“fa”:55}}, true)
更新多个文档
update默认情况只能对符合匹配条件的第一个文档执行更新。 要更新多个文档需要将 update 的第四个参数设置为 true db.blog.update({“title” : “second blog post”},{“$set”:{“123”:456}},true,true)
查询
mongoDB使用 find 来查询集合中的文档。
db.blog.find()
批量返回集合blog中的所有文档
db.blog.find({“age”:27})
返回键值包含 {“age”:27} 的文档
db.blog.find({“title”:”second”, “age”:27})
返回键值包含{“title”:”second”} AND {“age”:27} 的文档
find 的第二参数用于限定要返回的文档的键值。
db.blog.find({“title” : “second blog post”}, {“conntent”:1})
返回值仅包含 _id 和 conntent 键
db.blog.find({“title” : “second blog post”}, {“conntent”:0, “title”:0})
返回值不包含 conntent 和 title 键
$lt $lte $gt $gte $ne 对应 < <= > >= ≠
db.blog.find({“age”:{“$gte”:18,”$lt”:30}})
返回 age 大于18小于30的文档
文件存取操作¶
文件存取基于二进制数据类型,下面用 python 进行文件存储操作
from pymongo import MongoClient
client = MongoClient()
db = client.test
from bson import binary
file = open('test.txt', 'rb')
bin = binary.Binary(file.read())
db.test.insert({"file":bin})
file.close()
验证
cursor = db.test.find()
for document in cursor:
print (document)
写入
cursor = db.test.find_one()
file = open("buff.txt","wb")
file.write(cursor['file'])
file.close()
GridFS¶
Gridfs是用来支持大小超过16MB的文件的,不超过16M的文件存成文档就行了。Gridfs 的理念是:将大文件分割为多个块,将每个块作为独立的文档进行存储。
mongofiles put index-bottom.png
mongofiles list
mongofiles gett index-bottom.png
参考文献
[1] | MongoDB - Wikipedia, the free encyclopedia |