MongoDB for Java Programmer ——1

MongoDB官网提供了7周的免费教程视频,之前看过,感觉非常棒!本文以文字的方式总结,教程中的关键内容。

什么是MongoDB

  • a document database
    我们存储、查询mongoDB是使用Json或jsObject,底层是2进制的bason存储.支持的数据类型:string、number、object、array

比如我们设计一个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?"
        }
    ]
}

认识JSON与BSON

  • JSON
    Json是由key/value 键值对组成的对象,key 必须是 strings,每个fields用“,”逗号分隔,如上示例的Json可以看到,json支持 string、number、boolean、array、ojbect。注意,所谓的Object,其实就是允许value中存在内嵌的json对象,比如:
    .......
 "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/

  • BSON
    MongoDB 的存储其实是 BSON,BSON就是binary JSON(二进制的JSON).通过快速encode为BSON保证了数据的轻量级与高效。
    另外,在JSON中不支持interger、float统一用number,不支持Date(一般是用string代替)。但是Bson中这些都支持,还支持其他很多

示例:

// JSON
   { "hello" : "world" }

// BSON
"\x16\x00\x00\x00\x02hello\x00 
\x06\x00\x00\x00world\x00\x00"

MongoDB for Java Programmer ——1_第1张图片更多BSON介绍,请查看 > http://bsonspec.org/

不支持OR不需要事务、join查询?

这个数据模型基本涵盖了mongoDB支持存储的数据类型,mongoDB支持这样的数据模型设计的优势在于,灵活易读。上文中的数据,包含了 一个blog的所以基本信息,如文章标签、作者、标题、发布日期等等。因此,在mongoDB中不支持多表关联的查询,但是单独的document(也就是单个Json结构)很大程度上可以替代多表关联的需要,并且单独document保证了读取、写入的原子性,很显然很多情况下的多表事务也不再需要。

  • MongoDB使用示例
    MongoDB for Java Programmer ——1_第2张图片

CRUD操作

运行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

你可能感兴趣的:(mongoDB)