MongoDB官网提供了7周的免费教程视频,之前看过,感觉非常棒!本文以文字的方式总结,教程中的关键内容。
比如我们设计一个blog数据模型:
{
"headline": "Apple Reported Fourth Quarter Revenue Today",
"date": "2015-10-27T22:35:21.908Z",
"views": 1132,
"author": {
"name": "Bob Walker",
"title": "Lead Business Editor"
},
"published": true,
"tags": [
"AAPL",
{
"name": "city",
"value": "Cupertino"
},
[
"Electronics",
"Computers"
]
],
"comments": [
{
"name": "Frank",
"comment": "Great Story"
},
{
"name": "wendy",
"comment": "How are you?"
}
]
}
.......
"author": {
"name": "Bob Walker",
"title": "Lead Business Editor"
},
.......
author对应的value是一个json对象。另外,array中可以支持多种数据结构,比如:”tags”对应的value中,存放了 string,object,array。是不是非常的灵活,无拘无束
.......
"tags": [
"AAPL",
{
"name": "city",
"value": "Cupertino"
},
[
"Electronics",
"Computers"
]
]
.......
更多Json介绍,请查看 `> http://www.json.org/
示例:
// JSON
{ "hello" : "world" }
// BSON
"\x16\x00\x00\x00\x02hello\x00
\x06\x00\x00\x00world\x00\x00"
更多BSON介绍,请查看 > http://bsonspec.org/
这个数据模型基本涵盖了mongoDB支持存储的数据类型,mongoDB支持这样的数据模型设计的优势在于,灵活易读。上文中的数据,包含了 一个blog的所以基本信息,如文章标签、作者、标题、发布日期等等。因此,在mongoDB中不支持多表关联的查询,但是单独的document(也就是单个Json结构)很大程度上可以替代多表关联的需要,并且单独document保证了读取、写入的原子性,很显然很多情况下的多表事务也不再需要。
运行mongod.exe(mongod server),并打开mongo.exe(mongo shell 客户端)
> show dbs
local 0.000GB
test 0.000GB
video 0.000GB
> use video
switched to db video
use video命令切换到video数据库,如果不存在,则这条命令会自动创建新的video 数据库。
> show tables
movies
> show collections
movies
在mongodb中,传统关系型数据库中所说的“table”对应 mongoDB的“Collection”;关系型数据库中某个表的某一条数据在mongoDB中成为“document”.
> db.movies.insertOne({ "title": "Jaws", "year": 1975, "imdb": "tt0073195" });
{
"acknowledged" : true,
"insertedId" : ObjectId("57515e3976c4db16f1040633")
}
> db.movies.insertOne({ "title": "Mad Max 2: The Road Warrior", "year": 1981, "i
mdb": "tt0082694" })
{
"acknowledged" : true,
"insertedId" : ObjectId("57515e4276c4db16f1040634")
}
> db.movies.insertOne({ "title": "Raiders of the Lost Ark", "year": 1981, "imdb"
: "tt0082971" })
{
"acknowledged" : true,
"insertedId" : ObjectId("57515e4776c4db16f1040635")
}
每次插入一条新的数据,会自动生成一个唯一的ObjectId(….)对象,类似与关系型数据库中的自增主键。
> db.movies.find()
{ "_id" : ObjectId("57515abd01f37464ca2f2646"), "title" : "Jaws", "year" : 1975,
"imdb" : "tt0073195" }
.......
{ "_id" : ObjectId("57515e4776c4db16f1040635"), "title" : "Raiders of the Lost A
rk", "year" : 1981, "imdb" : "tt0082971" }
> db.movies.find().pretty()
{
"_id" : ObjectId("57515abd01f37464ca2f2646"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
......
{
"_id" : ObjectId("57515e4776c4db16f1040635"),
"title" : "Raiders of the Lost Ark",
"year" : 1981,
"imdb" : "tt0082971"
}
db.collectionName.find(parameters)用来查找数据,find中的参数有多种形式如下:
> db.movies.find({"title":"Jaws"})
{ "_id" : ObjectId("57515abd01f37464ca2f2646"), "title" : "Jaws", "year" : 1975,
"imdb" : "tt0073195" }
{ "_id" : ObjectId("57515e0a76c4db16f1040630"), "title" : "Jaws", "year" : 1975,
"imdb" : "tt0073195" }
{ "_id" : ObjectId("57515e3976c4db16f1040633"), "title" : "Jaws", "year" : 1975,
"imdb" : "tt0073195" }
> db.movies.find({"year":"1975"}).pretty()
> db.movies.find({"year":1975}).pretty()
{
"_id" : ObjectId("57515abd01f37464ca2f2646"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
..............
"imdb" : "tt0073195"
}
{
"_id" : ObjectId("57515e0a76c4db16f1040630"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
{
"_id" : ObjectId("57515e3976c4db16f1040633"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
返回的数据并不是一个简单的 document数组,而是一个指针对象。mongo shell 是一个功能强大的javaScript 拦截器,通过这个拦截器,我们可以通过移动指针获取想要的数据:
> var c=db.movies.find()
> c.hasNext()
true
> c.next()
{
"_id" : ObjectId("57515abd01f37464ca2f2646"),
"title" : "Jaws",
"year" : 1975,
"imdb" : "tt0073195"
}
.......
> c.next()
{
"_id" : ObjectId("57515e1376c4db16f1040632"),
"title" : "Raiders of the Lost Ark",
"year" : 1981,
"imdb" : "tt0082971"
}
> c.next()
2016-06-03T18:45:02.539+0800 E QUERY [thread1] Error: error hasNext: false :
DBQuery.prototype.next@src/mongo/shell/query.js:293:1
@(shell):1:1
> c.hasNext()
false