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


基本的操作

一、常用的命令和基礎知識

1、進入MongoDB shell

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

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

為了方便執行我們可以,這樣直接在終端輸入mongo調用就可以了

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

如果想永久生效,把他加入到/etc/profile中即可
2、查看數據庫命令

#可以通過show dbs;  或者 和Mysql一樣執行show databases;

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

3、打開數據庫

和關系型數據庫中打開數據庫是一樣的

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

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

但是這里需要注意:

在Mysql中的表中,我們給里面的每行叫做‘記錄’,但是在MongoDB中我們給每行數據叫做‘文檔’

所以在MongoDB中我們給每個表叫做‘集合’。集合中就是存儲了文檔的集合。

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

show collections;

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

總結:

1、MongoDB邏輯概念總結

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

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

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

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

 

 

 

 

2、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的一個子集!

一、在初識MongoDB的時候了解“幫助”

1、最高的幫助

在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
> 

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

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

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

3、查看集合中的幫助

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

二、創建數據庫

查看當前的數據庫

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

2、插入一條數據

> 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)

3、查詢數據

查詢一條數據

> 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.

 三、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
}

1、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中,1、null代表着值為null   2、者字段不存在。

那么怎么把字段存在並且為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的特點:優點:簡單、簡潔、容易理解、解析方便、記憶

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

四、命名規則

1、文檔的鍵名命名幾乎所有utf8字符串,只有以下少數例外

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

2、集合的命名幾乎所有的utf8字符串,只有以下少數例外

  1. $開頭
  2. \0   空字符串
  3. system.開頭
  4. ”“空字符串

 3、數據庫的命名幾乎所有的utf8字符串,只有以下少數例外

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

並且這里需要注意:數據庫名是不區分大小寫的,如果你有一個shuai的數據庫,你在創建一個SHUAI的數據庫插入數據的時候就會報錯,我們一般創建數據庫的時候都把MongoDB的數據庫名為小寫。

 

下一篇:MongoDB的基本操作!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM