MongoDB 基礎(chǔ)

MongoDB

基礎(chǔ)

  • 啟動 & 關(guān)閉

啟動

若啟動時,不指定任何參數(shù), MongoDB 會默認使用 /data/db 目錄存儲數(shù)據(jù),我們可以使用 --dbpath 來指定其它的路徑,比如我使用的是下面這樣的命令啟動的:
mongod --dbpath /Users/zcw/dev/MongoDB/db
上面這個是我的工作目錄,直接將 MongoDB 的程序和數(shù)據(jù)庫放在一起,我方便學習管理。

我們還可以在連接數(shù)據(jù)時指定服務器地址、端口號以及數(shù)據(jù)名等參數(shù),比如:

mongo mongo-db.xingzhewujiang.com:30000/ahaInsight

關(guān)閉

> use admin
> db.shutdownServer()

要注意的是,這個命令只允許在本地,或是一個經(jīng)過認證的客戶端。

  • 運行 shell
mongo shell

啟動時, shell 會打印出當前 shell 的版本號,連接到了哪個庫以及一些幫助信息等,這是一個功能完備的 JavaScript 解釋器,可以運行任意 JavaScript 程序,比如使用 JavaScript 標準庫或者定義以及調(diào)用 JavaScript 函數(shù)等。

  • Shell 中的基本操作(在 shell 中查看查看或操作數(shù)據(jù),會用到4個基本操作:創(chuàng)建、讀取、更新、刪除,即 CRUD 操作;)

創(chuàng)建
通過 db.createCollection() 函數(shù)可以先創(chuàng)建一個集合:

> db.createCollection("blog")
{ "ok" : 1 }

insert 可以將一個文檔添加到集合中:

> post = {"title": "這是一篇文章", "content": "這是文章的內(nèi)容。","date" : new Date()}

{
    "title" : "這是一篇文章",
    "content" : "這是文章的內(nèi)容。",
    "date" : ISODate("2015-04-21T02:22:52.899Z")
}

這是一個有效的 MongoDB 文檔,所以可以用 insert 方法將其保存到集合中。

> db.blog.insert(post)

WriteResult({ "nInserted" : 1 })

接著可以使用 find 方法查找這篇文章:

> db.blog.find()

{ "_id" : ObjectId("5535b574b705494e688e218a"), "title" : "這是一篇文章", "content" : "這是文章的內(nèi)容。", "date" : ISODate("2015-04-21T02:22:52.899Z") }

可以看到我們的數(shù)據(jù)都已經(jīng)完整的保存下來了,同時,MongoDB 還為我們自動生成了一個 _id 參數(shù)。

讀取
find 與 findOne 方法可以用于查詢集合里的文檔:

> db.blog.findOne()

{
    "_id" : ObjectId("5535b574b705494e688e218a"),
    "title" : "這是一篇文章",
    "content" : "這是文章的內(nèi)容。",
    "date" : ISODate("2015-04-21T02:22:52.899Z")
}

更新
使用 update 修改博客文章,它至少接受兩個參數(shù),第一個是限定條件,第二個是新文檔,比如我們現(xiàn)在要給 post 加上評論列表:

> post.comments = []

[ ]

然后,用新版本的 post 替換標題為 《這是一篇文章》的文章:

> db.blog.update({"title":"這是一篇文章"},post)

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.blog.findOne()
{
    "_id" : ObjectId("5535b574b705494e688e218a"),
    "title" : "這是一篇文章",
    "content" : "這是文章的內(nèi)容。",
    "date" : ISODate("2015-04-21T02:22:52.899Z"),
    "comments" : [ ]
}

可以看到,comments 已經(jīng)更新到原來的那個 post 中去了。

刪除
使用 remove 可以刪除集合中的文檔,若沒有任何限定參數(shù),它將刪除集合中的所有數(shù)據(jù),也可以像下面這樣,刪除標題為《這是一篇文章》的文章:

> db.blog.remove({"title":"這是一篇文章"})
WriteResult({ "nRemoved" : 1 })
> db.blog.find()
> 

除了交互式的使用 shell 外,我們還可以將命令保存在一個文件中,比如 script.js ,然后使用 mongo 命令直接執(zhí)行它們,一次可以傳入多個文件名,mongo shell 會依次執(zhí)行傳入的腳本,然后退出:

mongo script.js script1.js

如果希望指定主機和端口來運行上面的腳本,還可以這樣做:

mongo --quiet host.name:30000/dbname script.js script1.js

—quiet 可以讓 mongo shell不打印 MongoDB shell version... 這樣的提示信息。

在交互式的命令行中,還可以使用 load() 函數(shù)加載并運行腳本:


> load("script.js")
i am a string printed by script.js

知道這個之后,我們可以把一些能用的函數(shù)保存到一個文件里面,然后再將他們加載進 shell 交互界面里面來:

創(chuàng)建一個名為 connectTo.js 的文件,內(nèi)容如下:

/**
 * 鏈接到指定的數(shù)據(jù)庫,然后將 db 指向這個鏈接
 */
var connectTo = function(port, dbname) {
    if (!port) {
        port = 27017;
    }

    if (!dbname) {
        dbname = "test"
    }

    db = connect("localhost:" + port + "/" + dbname)
    return db
}

然后我們進入 shell :


> typeof connectTo
undefined
> load("connectTo.js")
true
> typeof connectTo
function

我們可以使用腳本讓能用的管理和任務自動化,比如,我們想在每一次 shell 啟用時,都加載上面定義的那個函數(shù),這個時候我們可以用到一個名為 .mongorc.js 的文件。

在自己的家目錄中(不同的系統(tǒng)都不一樣),新建一個名為 .mongorc.js 的文件,然后寫入下面這些內(nèi)容:

print("你好,我來自 .mongorc.js 文件")

然后,重新進入 shell:

mongo
MongoDB shell version: 3.0.2
connecting to: test
你好,我來自 .mongorc.js 文件
  • MongoDB 客戶端

shell 是一個獨立的 MongoDB客戶端,啟動時, shell 會連到 MongoDB 服務器的 test 數(shù)據(jù)庫,并將數(shù)據(jù)庫連接賦值給合局變量 db ,這個變量是通過 shell訪問 MongoDB 的主要入口點,可以使用 db 查看當前指向哪個數(shù)據(jù)庫:db

除了JavaScript語法外,MongoDB 還提供了一些語法糖,以幫助我們更好的管理數(shù)據(jù)庫,比如:

> use foobar
switched to db foobar

啟動時,可以讓 mongo shell 不連接任何的 mongod ,可以通過 --nodb 參數(shù):

mongo --nodb

啟動之后,我們可以在需要時執(zhí)行 new Mongo(hostname) 命令就可以連接到想要連接的 mongod 了:

> conn = new Mongo("host.name:30000")
connection to host.name:30000
> db = conn.getDB("dbname")
dbname

在使用 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
  • 數(shù)據(jù)類型

MongoDB 的文檔與 JavaScript 中的對象相近,因而可以認為類似于 JavaScript 中的 JSON,JSON 是一種簡單的數(shù)據(jù)表示方式,僅有 6種數(shù)據(jù)類型,分別為 null、bool、number、string、array 和 object。

MongoDB在保留 JSON 基本鍵/值對特性的基礎(chǔ)上,添加了其它的一些數(shù)據(jù)類型:null

用于表示空值或者不存在的字段:

{
    "x" : null
}

number 數(shù)值

shell 默認使用 64位浮點型數(shù)值,對于整型值,可使用 NumberInt 類或 NumberLong 類:

{
    "pi" : 3.14,
    "x" : 3,
    "ni" : NumberInt("3"),
    "nl" : NumberLong("3")
}

string 字符串

UTF-8 類型的字符串都可以表示為字符串類型的數(shù)據(jù):

{
    "x" : "this is a string.",
    "y" : "這是一個NB的字符串"
}

date 日期

日期被存儲 為自新紀元以來經(jīng)過的毫秒數(shù),不存儲時區(qū):

{
    "x" : new Date()
}

regular expression 正則表達式

在進行查詢時,我們可以直接使用正則表達式作為值,語法與 javascript 的相同:

{
    "x" : /foobar/i
}

array 數(shù)組

數(shù)據(jù)列表或數(shù)據(jù)集可以表達為數(shù)組:

{
    "a" : ["x", "y" , "z"]
}

object id 對象ID

對象ID是一個 12 字節(jié)的ID,它是文檔的唯一標識:

{
    "x" : ObjectId()
}

object id 以以下方式生成:

|0|1|2|3|4|5|6|7|8|9|10|11|
|  時間戳 ?。C器|PID|   計數(shù)器  ?。?

時間戳在前,對于索引效率提高有一定的作用;同時它也帶了一定的時間信息,一些驅(qū)動可以從 ObjectId 獲取這些信息;
時間戳與機器碼還有 PID 組合在一起,提供了秒級別的唯一性,機器碼是機器主機名的散列值(hash);
PID確保了同一臺主機不同進程產(chǎn)生的 ObjectId 的唯一性,接下來的字節(jié)
最后的計數(shù)器,確保同一臺機器同一個進程在同一秒內(nèi)產(chǎn)生的 ObjectId 是不一樣的,一秒鐘最多允許每個進程擁有 2563 個不同的ObjectId。
自動生成 _id

若插入文檔時,沒有提供 _id 鍵

object 內(nèi)嵌文檔

文檔可以嵌套其它文檔,被嵌套的文檔作為父文檔的值:

{
    "o" : {
        "name" : "child object"
    }
}

binary data 二進制數(shù)據(jù)

任意字節(jié)的字符串,它不直直接在 shell 中使用,如果要將非 utf-8 字符保存到數(shù)據(jù)庫中,二進制數(shù)據(jù)是唯一的實現(xiàn)方式。

javascript 代碼

查詢和文檔中可以包括做生意 JavaScript 代碼:

{
    "script" : function() { /* code goes here */ }
}

timestamps 時間戳

不同于 Date 類型的時間戳值,它是一個 64位長度的值,它是:

前面的 32位為 time_t 值,(Unix 時間戳)
后32位是一個在給定的時間內(nèi)的自增值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容