亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 5674 | 回復(fù): 1
打印 上一主題 下一主題

[MongoDB] 【譯】 MongoDB 入門(mén)教程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2012-02-21 20:32 |只看該作者 |倒序?yàn)g覽
【譯】 MongoDB 入門(mén)教程


啟動(dòng)數(shù)據(jù)庫(kù)
下載 MongoDB, 解壓后并啟動(dòng):

$ bin/mongodMongoDB 默認(rèn)存儲(chǔ)數(shù)據(jù)目錄為 /data/db/ (或者 c:\data\db), 當(dāng)然你也可以修改成不同目錄, 只需要指定 –dbpath 參數(shù):

$ bin/mongod --dbpath /path/to/my/data/dir獲取數(shù)據(jù)庫(kù)連接

現(xiàn)在我們就可以使用自帶的shell工具來(lái)操作數(shù)據(jù)庫(kù)了. (我們也可以使用各種編程語(yǔ)言的驅(qū)動(dòng)來(lái)使用MongoDB, 自帶的shell工具可以方便我們管理數(shù)據(jù)庫(kù))

啟動(dòng) MongoDB JavaScript 工具:

$ bin/mongo默認(rèn) shell 連接的是本機(jī)localhost 上面的 test庫(kù), 會(huì)看到:

MongoDB shell version: 0.9.8
url: test
connecting to: test
type "help" for help
>“connecting to:” 這個(gè)會(huì)顯示你正在使用的數(shù)據(jù)庫(kù)的名稱. 想換數(shù)據(jù)庫(kù)的話可以:

> use mydb可以輸入 help 來(lái)查看所有的命令.

插入數(shù)據(jù)到集合
下面我們來(lái)建立一個(gè)test的集合并寫(xiě)入一些數(shù)據(jù). 建立兩個(gè)對(duì)象, j 和 t , 并保存到集合中去.
在例子里 ‘>’ 來(lái)表示是 shell 輸入提示符

> j = { name : "mongo" };
{"name" : "mongo"}
> t = { x : 3 };
{ "x" : 3 }
> db.things.save(j);
> db.things.save(t);
> db.things.find();
{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
>有幾點(diǎn)需要注意下 :

不需要預(yù)先建立一個(gè)集合. 在第一次插入數(shù)據(jù)時(shí)候會(huì)自動(dòng)建立.
在例子其實(shí)可以存儲(chǔ)任何結(jié)構(gòu)的數(shù)據(jù), 當(dāng)然在實(shí)際應(yīng)用我們存儲(chǔ)的還是相同元素的集合. 這個(gè)特性其實(shí)可以在應(yīng)用里很靈活, 你不需要類似alter table 來(lái)修改你的數(shù)據(jù)結(jié)構(gòu)
每次插入數(shù)據(jù)時(shí)候?qū)ο蠖紩?huì)有一個(gè)ID, 名字叫 _id.
當(dāng)你運(yùn)行不同的例子, 你的對(duì)象ID值都是不同的.
下面再加點(diǎn)數(shù)據(jù):

> for( var i = 1; i < 10; i++ ) db.things.save( { x:4, j:i } ); > db.things.find();
{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}請(qǐng)注意下, 這里循環(huán)次數(shù)是10, 但是只顯示到8, 還有2條數(shù)據(jù)沒(méi)有顯示.

如果想繼續(xù)查詢下面的數(shù)據(jù)只需要使用 it 命令, 就會(huì)繼續(xù)下面的數(shù)據(jù):

{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}繼續(xù)

> it
{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}
{"x" : 4 , "j" : 10 , "_id" : ObjectId("497cf87151712cf7758fbdc6")}從技術(shù)上講 find() 返回一個(gè)游標(biāo)對(duì)象. 但在上面的例子里, 并沒(méi)有拿到一個(gè)游標(biāo)的變量. 所以 shell 自動(dòng)遍歷游標(biāo), 返回一個(gè)初始化的set, 并允許我們繼續(xù)用 it 迭代輸出.
當(dāng)然我們也可以直接用游標(biāo)來(lái)輸出, 不過(guò)這個(gè)是下一部分的內(nèi)容了.

查詢數(shù)據(jù)
在沒(méi)有深入查詢之前, 我們先看看怎么從一個(gè)查詢中返回一個(gè)游標(biāo)對(duì)象. 可以簡(jiǎn)單的通過(guò) find() 來(lái)查詢, 他返回一個(gè)任意結(jié)構(gòu)的集合. 如果實(shí)現(xiàn)特定的查詢稍后講解.
實(shí)現(xiàn)上面同樣的查詢, 然后通過(guò) while 來(lái)輸出:

> var cursor = db.things.find();
> while (cursor.hasNext()) { print(tojson(cursor.next())); }
{"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
{"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
{"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
{"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
{"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
{"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
{"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
{"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
{"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}
>上面的例子顯示了游標(biāo)風(fēng)格的迭代輸出. hasNext() 函數(shù)告訴我們是否還有數(shù)據(jù), 如果有則可以調(diào)用 next() 函數(shù). 這里我們也用了自帶的 tojson() 方法返回一個(gè)標(biāo)準(zhǔn)的 JSON 格式數(shù)據(jù).

當(dāng)我們使用的是 JavaScript shell, 可以用到JS的特性, forEach 就可以輸出游標(biāo)了. 下面的例子就是使用 forEach() 來(lái)循環(huán)輸出:

forEach() 必須定義一個(gè)函數(shù)供每個(gè)游標(biāo)元素調(diào)用.
  1. > db.things.find().forEach( function(x) { print(tojson(x));});
  2. {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
  3. {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
  4. {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
  5. {"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
  6. {"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
  7. {"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
  8. {"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
  9. {"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
  10. {"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
  11. {"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
  12. {"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}
復(fù)制代碼
>在 mongo shell 里, 我們也可以把游標(biāo)當(dāng)作數(shù)組來(lái)用 :

> var cursor = db.things.find();
> print (tojson(cursor[4]));
{"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}使用游標(biāo)時(shí)候請(qǐng)注意占用內(nèi)存的問(wèn)題, 特別是很大的游標(biāo)對(duì)象, 有可能會(huì)內(nèi)存溢出. 所以應(yīng)該用迭代的方式來(lái)輸出.
下面的示例則是把游標(biāo)轉(zhuǎn)換成真實(shí)的數(shù)組類型:

> var arr = db.things.find().toArray();
> arr[5];
{"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}請(qǐng)注意這些特性只是在 mongo shell 里使用, 而不是所有的其他應(yīng)用程序驅(qū)動(dòng)都支持.

MongoDB 游標(biāo)對(duì)象不是沒(méi)有快照 – 如果有其他用戶在集合里第一次或者最后一次調(diào)用 next(), 你可以得不到游標(biāo)里的數(shù)據(jù). 所以要明確的鎖定你要查詢的游標(biāo).

指定條件的查詢
到這里我們已經(jīng)知道怎么從游標(biāo)里實(shí)現(xiàn)一個(gè)查詢并返回?cái)?shù)據(jù)對(duì)象, 下面就來(lái)看看怎么根據(jù)指定的條件來(lái)查詢.

下面的示例就是說(shuō)明如何執(zhí)行一個(gè)類似SQL的查詢, 并演示了怎么在 MongoDB 里實(shí)現(xiàn). 這是在 MongoDB shell 里查詢, 當(dāng)然你也可以用其他的應(yīng)用驅(qū)動(dòng)或者語(yǔ)言來(lái)實(shí)現(xiàn):
  1. SELECT * FROM things WHERE name="mongo">db.things.find({name:"mongo"}).forEach(function(x) { print(tojson(x));});
  2. {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
  3. >SELECT * FROM things WHERE x=4> db.things.find({x:4}).forEach(function(x) { print(tojson(x));});
  4. {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
  5. {"x" : 4 , "j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
  6. {"x" : 4 , "j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
  7. {"x" : 4 , "j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
  8. {"x" : 4 , "j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
  9. {"x" : 4 , "j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
  10. {"x" : 4 , "j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
  11. {"x" : 4 , "j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
  12. {"x" : 4 , "j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}
復(fù)制代碼
>查詢條件是 { a:A, b:B, … } 類似 “where a==A and b==B and …”, 更多的查詢方式可以參考 Mongo 開(kāi)發(fā)教程部分.

上面顯示的是所有的元素, 當(dāng)然我們也可以返回特定的元素, 類似于返回表里某字段的值, 只需要在 find({x:4}) 里指定元素的名字, 比如 j:
  1. SELECT j FROM things WHERE x=4> db.things.find({x:4}, {j:true}).forEach(function(x) { print(tojson(x));});
  2. {"j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
  3. {"j" : 2 , "_id" : ObjectId("497cf87151712cf7758fbdbe")}
  4. {"j" : 3 , "_id" : ObjectId("497cf87151712cf7758fbdbf")}
  5. {"j" : 4 , "_id" : ObjectId("497cf87151712cf7758fbdc0")}
  6. {"j" : 5 , "_id" : ObjectId("497cf87151712cf7758fbdc1")}
  7. {"j" : 6 , "_id" : ObjectId("497cf87151712cf7758fbdc2")}
  8. {"j" : 7 , "_id" : ObjectId("497cf87151712cf7758fbdc3")}
  9. {"j" : 8 , "_id" : ObjectId("497cf87151712cf7758fbdc4")}
  10. {"j" : 9 , "_id" : ObjectId("497cf87151712cf7758fbdc5")}
復(fù)制代碼
>請(qǐng)注意 “_id” 元素會(huì)一直被返回.

findOne() – 語(yǔ)法糖
為了方便, mongo shell (其他驅(qū)動(dòng)) 避免游標(biāo)的可能帶來(lái)的開(kāi)銷, 提供一個(gè)findOne() 函數(shù). 這個(gè)函數(shù)和 find() 參數(shù)一樣, 不過(guò)他返回游標(biāo)里第一條數(shù)據(jù), 或者返回 null 空數(shù)據(jù)庫(kù).

作為一個(gè)例子, name==’mongo’ 可以用很多方法來(lái)實(shí)現(xiàn), 可以用 next() 來(lái)循環(huán)游標(biāo)(需要校驗(yàn)是否為null), 或者當(dāng)做數(shù)組返回第一個(gè)元素.

但是用 findOne() 方法則更簡(jiǎn)單和高效:
  1. > var mongo = db.things.findOne({name:"mongo"});
  2. > print(tojson(mongo));
  3. {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
  4. >findOne 方法更跟 find({name:”mongo”}).limit(1) 一樣.
復(fù)制代碼
limit() 查詢
你可以需要限制結(jié)果集的長(zhǎng)度, 可以調(diào)用 limit 方法.

這是強(qiáng)烈推薦高性能的原因, 通過(guò)限制條數(shù)來(lái)減少網(wǎng)絡(luò)傳輸, 例如:
  1. > db.things.find().limit(3);
  2. in cursor for : DBQuery: example.things ->
  3. {"name" : "mongo" , "_id" : ObjectId("497cf60751712cf7758fbdbb")}
  4. {"x" : 3 , "_id" : ObjectId("497cf61651712cf7758fbdbc")}
  5. {"x" : 4 , "j" : 1 , "_id" : ObjectId("497cf87151712cf7758fbdbd")}
  6. >更多幫助
復(fù)制代碼
除非了一般的 help 之外, 你還可以查詢 help 數(shù)據(jù)庫(kù)和db.whatever 來(lái)查詢具體的說(shuō)明.

如果你對(duì)一個(gè)函數(shù)要做什么, 你可以不輸入 {{()}} 這些結(jié)束的括號(hào)則可以輸出實(shí)現(xiàn)的源碼, 例如:
  1. > db.foo.insert
  2. function (obj, _allow_dot) {
  3.     if (!obj) {
  4.         throw "no object passed to insert!";
  5.     }
  6.     if (!_allow_dot) {
  7.         this._validateForStorage(obj);
復(fù)制代碼
}
    return this._mongo.insert(this._fullName, obj);
}mongo 是一個(gè)完整的 JavaScript shell程序, 所以在 shell 里完全可以私用JS的方法、類、語(yǔ)法. 此外, MongoDB 定義很多自己的類和全局變量 (比如 db). 這里可以查看完整的API說(shuō)明 http://api.mongodb.org/js/.

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2012-02-24 17:42 |只看該作者
謝謝分享
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP