日期:2014年12月27日 周六
信息收集
MongoDB: The Definitive Guide 的豆瓣主页
Mongodb官方文档
- 评价都是来自中文版,看了看价格,40刀确实是贵了,默默的准备下载免费的PDF吧,中英对照着看。
- 评论提及官方文档似乎更好。
- 该书适合入门,对应另外一本《mongoDB 50 tips》偏设计多些。
- 比对其他书籍的目录和评论发现自己入门把官方文档看一遍就差不多了。有更加深的需求在细致地进行学习。
MongoDB简介
MongoDB是开源的文档型数据库数,每条记录对应一个文档,文档类似于JSON的数据格式组织在一起,文档型数据库数的几个有点:
- 文档格式能够响应多种编程语言。
- 嵌套的文档减少了昂贵的join导致的开销。
- Dynamic schema supports fluent polymorphism ?
MongoDB的关键特性(牛皮轻吹~)
- 高性能
- 高可用性
- 可伸缩性
安装
在Mac下安装MongoDB有两种方法,如下介绍通过OS X package manager Homebrew安装的步骤:
$ brew update
$ brew install mongodb
开始使用
以下部分介绍使用mongo shell做基本的数据库操作, mongo标准的MongoDB发布的一部分,它提供了一个特性完全的JavaScript环境以及所有MongoDB的接口。
连接数据库
简单地通过
mongod
我们启动了MongoDB,通过mongo
我们连接到了MongoDB的server。启动以后,默认使用名为 test 的数据库;通过
db
可以查看当前所在数据库;通过show dbs
会展示所有的数据库;通过use mydb
可以切换到对应数据库;mydb不存在,use mydb
也能成功(通过db查看的结果是mydb),但是show dbs命令的结果中不包含mydb,因为mydb要在插入数据以后才会被真正创建。通过
help
可以查看帮助; 甚至你可以通过后面添加.help()
查看方法对象的使用。
创建集合和插入文档
在下面的例子中,我们使用数据库mydb,插入文档到一个新的集合testData。
当集合第一次被使用的时候,MongoDB会隐式地创建它,因此在插入数据之前你无需创建它,并且因为MongoDB使用的动态的表,在插入问的那个之前你不需要提前定义好文档结构。
- 确保使用是mydb,不是的话切换到mydb
- 创建两个文档
j = { name : "mongo" }
k = { x : 3 } - 插入文档到集合中
db.testData.insert( j )
db.testData.insert( k ) - 查看集合是否生成
show collections
- 查看结合中的文档
db.testData.find()
{ "_id" : ObjectId("549d5a4c341aee5d3faa5c77"), "name" : "mongo" }
{ "_id" : ObjectId("549d5a50341aee5d3faa5c78"), "x" : 3 }
所有的 MongoDB 文档必须有唯一的 _id值,mongo在插入文档到集合的时候会自动创建这么一个唯一的ObjectId作为_id的值。
使用for循环插入文档
在mongo shell中通过执行如下代码可以批量插入一定数量的假数据:
for (var i = 1; i <= 25; i++) {
db.testData.insert( { x : i } )
}
通过db.testData.find()
只能显示前20条数据,find()会返回游标cursor,在shell中键入下it
会将剩余的数据都显示出来。
使用JavaScript方法插入文档
也可以在~/.mongorc.js中插入JavaScript方法:
function insertData(dbName, colName, num) {
var col = db.getSiblingDB(dbName).getCollection(colName);
for (i = 0; i < num; i++) {
col.insert({x:i});
}
print(col.count());
}
然后再在shell中执行:
insertData("mydb", "testData", 400)
使用游标
- 使用循环+游标来遍历集
var c = db.testData.find()
while ( c.hasNext() ) printjson( c.next() )
- 使用游标做数组操作
var c = db.testData.find()
printjson( c [ 4 ] )
- 查询特殊的文档
db.testData.find( { x : 18 } )
- 返回一个文档(不同于find会返回包含所有结果的游标)
db.testData.findOne()
- 限制返回文档的条数
db.testData.find().limit(3)