MongoDB【第二篇】MongoDB邏輯與物理存儲結構

基本的操做

1、經常使用的命令和基礎知識html

一、進入MongoDB shellsql

首先咱們進入到MongoDB所在目錄執行mongodb

cd /work/app/mongodb/bin/
#啓動
./mongo

爲了方便執行咱們能夠,這樣直接在終端輸入mongo調用就能夠了shell

alias mongo='/work/app/mongodb/bin/mongo'

若是想永久生效,把他加入到/etc/profile中便可
二、查看數據庫命令數據庫

#能夠經過show dbs;  或者 和Mysql同樣執行show databases;

> show dbs;
local  0.000GB
> show databases;
local  0.000GB
> 

三、打開數據庫數組

和關係型數據庫中打開數據庫是同樣的app

#使用數據庫使用use dbs便可,進入後可使用showtables;去查看數據庫中的表
> use dbs;
switched to db dbs
> show tables;
> 

從上面能夠看出,一個MongoDB實例是由一個或多個數據庫組成的性能

可是這裏須要注意:ui

在Mysql中的表中,咱們給裏面的每行叫作‘記錄’,可是在MongoDB中咱們給每行數據叫作‘文檔’lua

因此在MongoDB中咱們給每一個表叫作‘集合’。集合中就是存儲了文檔的集合。

查看當前數據庫中的集合命令爲:

show collections;

因此:show tables; 和 show databases;命令只是兼容關係型數據庫而已,所以他們之間的層次關係就明白了,NICE~

總結:

一、MongoDB邏輯概念總結

文檔:文檔(Document)是MongodDB中的核心概念,他是MongoDB邏輯存儲的最小基本單元

集合:多個文檔組成的集合

數據庫:多個集合組成的數據庫

MongoDb 關係型數據庫Mysql
文檔(document) 行(row)
集合(collections) 表(table)
數據庫(databases) 數據庫(databases)

 

 

 

 

二、MongoDB 物理存儲總結

2.1 命名空間文件:命名空間(.ns結尾文件) 它存儲了分配和正在使用的磁盤空間

2.2 數據庫文件:以(0,1,2,3...)結尾的,而且後面的文件大小是前面一個文件大小的2倍!

爲何MongodDB物理存儲使用這種方式設計呢?好處是什麼?:當一方面若是數據庫很小的時候,不至於數據庫小而浪費存儲空間,另一方面若是數據庫增加比較快,經過預分配的方式,是上一個文件的兩倍的辦法,來避免數據的劇增形成分配文件形成的性能降低,來預分配空間,以空間的辦法來換取性能的提高。

2.3 日誌文件

    系統日誌文件logpath
    oplog複製操做日誌文件 #只有在主從複製開啓以後纔會出現
    慢查詢日誌  #須要開啓後才能夠

慢查詢日誌經過help就能夠看到如何啓用

  #這兩個參數須要組合使用 --slowms 大於多少秒纔算慢查詢 
  --slowms arg (=100)                   value of slow for profile and console 
                                        log
  #默認是關閉的1爲慢查詢,all爲全部的都日誌
  --profile arg                         0=off 1=slow, 2=all

咱們能夠經過配置文件進行設置:

profile=1
#生產中這裏應該大於200毫秒,而且這個必須根據生產中實際的需求來定義的
slowms=1

MongoDB數據類型

MongodDB的數據類型是:BSON的數據類型

BSON是Binary JSON是二進制的格式,能將MongoDB的全部文檔表示爲字節字符串!

JSON:是一種輕量級的數據交換格式。它基於JavaScript的一個子集!

1、在初識MongoDB的時候瞭解「幫助」

一、最高的幫助

在MongoDB shell中輸入help

> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
> 

二、打開數據庫在數據庫中查看幫助

進入到數據庫中後咱們可使用db.help()查看數據庫級別的幫助

db.help()  #查看數據庫級別的幫助,裏面會顯示數據庫級別的幫助

三、查看集合中的幫助

> show dbs;
local  0.000GB
tim    0.000GB
> show collections;
users
> db.users.help()

2、建立數據庫

查看當前的數據庫

> show dbs;
local  0.000GB
tim    0.000GB

能夠看到當前只有tim和系統自帶的local數據庫,咱們經過use 去打開一個數據庫!shuai而且查看數據庫

> use shuai;
switched to db shuai
> show dbs;
local  0.000GB
tim    0.000GB
> 

發現數據庫並無添加,當咱們在給數據庫中的集合插入一條文檔的時候就會:自動建立一條文檔合、一個集合、一個數據庫。

> db.users.insert({"uid":1})
WriteResult({ "nInserted" : 1 })
> 
#這個時候看下是否添加了數據庫和集合!!!
> show dbs;
local  0.000GB
shuai  0.000GB
tim    0.000GB

#當前數據庫"shuai"下的集合
> show collections;
users
> 

二、插入一條數據

> db.users.insert({"uid":2,"uname":"luotianshuai","isvip":true,"sex":null,"favorite":["apple","banana",1,2,3,4,5],"regtime":new Date()})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("5754f1ea4b7f62c4992c4ef4"), "uid" : 1 }
{ "_id" : ObjectId("5754f2c84b7f62c4992c4ef5"), "uid" : 2, "uname" : "luotianshuai", "isvip" : true, "sex" : null, "favorite" : [ "apple", "banana", 1, 2, 3, 4, 5 ], "regtime" : ISODate("2016-06-06T03:49:28.946Z") }

注:這裏的數據類型,列表、字典,這裏的new Date()是MongoDB就相似Django Model的時間選項相似於:date = models.DateTimeField(auto_now=True)

三、查詢數據

查詢一條數據

> db.users.findOne({"uid":2})
{
        "_id" : ObjectId("5754f2c84b7f62c4992c4ef5"),
        "uid" : 2,
        "uname" : "luotianshuai",
        "isvip" : true,
        "sex" : null,
        "favorite" : [
                "apple",
                "banana",
                1,
                2,
                3,
                4,
                5
        ],
        "regtime" : ISODate("2016-06-06T03:49:28.946Z")
}
> 

而且咱們能夠吧取出來的數據保存在一個變量中,而且經過變量去調用其值

> a = db.users.findOne({"uid":2})
{
        "_id" : ObjectId("5754f2c84b7f62c4992c4ef5"),
        "uid" : 2,
        "uname" : "luotianshuai",
        "isvip" : true,
        "sex" : null,
        "favorite" : [
                "apple",
                "banana",
                1,
                2,
                3,
                4,
                5
        ],
        "regtime" : ISODate("2016-06-06T03:49:28.946Z")
}

#而且能夠經過變量去調用裏面的值
> a.
a._id                    a.favorite               a.isvip                  a.regtime                a.toLocaleString(        a.uid                    a.valueOf(
a.constructor            a.hasOwnProperty(        a.propertyIsEnumerable(  a.sex                    a.toString(              a.uname
> a.

 3、MongoDB中的數據類型和Mysql數據類型對比

> db.users.insert({"uid":3,"salary":312402039840981098098309,"a":1.2423412314223423413})
WriteResult({ "nInserted" : 1 })

> b = db.users.findOne({"uid":3})
{
        "_id" : ObjectId("5754f7214b7f62c4992c4ef6"),
        "uid" : 3,
        "salary" : 3.124020398409811e+23,
        "a" : 1.2423412314223423
}

一、MongoDB中的數字類型和Mysql中的數字類型對比

查看MongoDB中的數字類型他們都是number類型的

> typeof(b.uid)
number
> typeof(b.salary)
number
> typeof(b.a)
number
> 

能夠看出在MongoDB中全部的數字類型都是數值類型的,咱們比較下Mysql中的數字類型!

在Mysql中相似「uid":3 這個3應該屬於普通的整數,或者是短整形

相似薪水:salary 應該是長整型

相似a應該是雙精度浮點型

數字:

在Mysql中對數字類型分的很是詳細,有短整形、長整型,浮點數分爲單精度和雙精度浮點型,而在MongoDB都是64位的浮點數!這樣的好處就是很簡單,他不須要區分數字類型,就是number類型,簡單、簡潔。容易理解和在處理的時候也方便。

字符串:

在Mysql中分爲定長、變長字符串,不管是定長字符串或者變長字符串,都要對長度事先定義!可是MongoDB中無需事先定義,對長度沒有而且的定義而且他甚至能夠存儲一篇文章!也表現的簡單、簡潔、

布爾型:

布爾值只有:真、假分別用:True  False  表示

null值:

> db.users.find({"sex":null})
{ "_id" : ObjectId("5754f1ea4b7f62c4992c4ef4"), "uid" : 1 }
{ "_id" : ObjectId("5754f2c84b7f62c4992c4ef5"), "uid" : 2, "uname" : "luotianshuai", "isvip" : true, "sex" : null, "favorite" : [ "apple", "banana", 1, 2, 3, 4, 5 ], "regtime" : ISODate("2016-06-06T03:49:28.946Z") }
{ "_id" : ObjectId("5754f7214b7f62c4992c4ef6"), "uid" : 3, "salary" : 3.124020398409811e+23, "a" : 1.2423412314223423 }
> 

我們查詢以」sex「 爲null條件,可是查詢出了3條結果能夠得出:

在MongoDB中,一、null表明着值爲null   二、者字段不存在。

那麼怎麼把字段存在而且爲null值得文檔查找出來呢?

> db.users.find({"sex":null,"sex":{"$exists":true}})
{ "_id" : ObjectId("5754f2c84b7f62c4992c4ef5"), "uid" : 2, "uname" : "luotianshuai", "isvip" : true, "sex" : null, "favorite" : [ "apple", "banana", 1, 2, 3, 4, 5 ], "regtime" : ISODate("2016-06-06T03:49:28.946Z") }
> 
#咱們查找sex爲null的而且給其加一個條件    值存在{"$exists":true}

數組:

一組數據集合

對象類型:

好比日期類型,日期類型是經過對象類型產生的,可是處理日期比較麻煩!這個也是MongoDB的問題表現力不足

 

BSON的特色:優勢:簡單、簡潔、容易理解、解析方便、記憶

缺點:表現力不足好比日期格式(處理起來就比較麻煩)

4、命名規則

一、文檔的鍵名命名幾乎全部utf8字符串,只有如下少數例外

  1. $開頭
  2. \0   空字符串
  3. _下劃線開頭,能夠用可是不建議使用,凡是系統生成的都是以_開頭命名的,因此在實際生產中咱們不使用_開頭的!

二、集合的命名幾乎全部的utf8字符串,只有如下少數例外

  1. $開頭
  2. \0   空字符串
  3. system.開頭
  4. 」「空字符串

 三、數據庫的命名幾乎全部的utf8字符串,只有如下少數例外

  1. $開頭
  2. \0   空字符串
  3. system.開頭
  4. 」「空字符串
  5. /
  6. \

而且這裏須要注意:數據庫名是不區分大小寫的,若是你有一個shuai的數據庫,你在建立一個SHUAI的數據庫插入數據的時候就會報錯,咱們通常建立數據庫的時候都把MongoDB的數據庫名爲小寫。

 

下一篇:MongoDB的基本操做!

相關文章
相關標籤/搜索