亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 數(shù)據(jù)庫(kù) > PostgreSQL > 正文

在PostgreSQL的基礎(chǔ)上創(chuàng)建一個(gè)MongoDB的副本的教程

2020-03-12 23:53:47
字體:
供稿:網(wǎng)友

這篇文章主要介紹了在PostgreSQL的基礎(chǔ)上創(chuàng)建一個(gè)MongoDB的副本的教程,使在使用NoSQL的同時(shí)又能用到PostgreSQL中的東西,需要的朋友可以參考下

我有一個(gè)偷懶的想法。這個(gè)好點(diǎn)子該如何開始呢?好吧,這是一個(gè)恰如其分的小瘋狂:為什么不直接在Postgres的基礎(chǔ)上建立我們自己的MongoDB版本呢?這聽起來有點(diǎn)牽強(qiáng)附會(huì),但卻簡(jiǎn)單而實(shí)在。

當(dāng)NoSQL運(yùn)動(dòng)風(fēng)生水起的時(shí)候,Postgres社區(qū)沒有干坐著擺弄他們的大拇指。他們持續(xù)開發(fā),貫穿整個(gè)Postgres的生態(tài)系統(tǒng),幾個(gè)突出的功能吸引了我的眼球:整合JSON支持和PLV8。PLV8把V8 Javascript引擎引入到Postgres,他讓Javascript成為一個(gè)第一類別的語(yǔ)言(first-class language)。擁有JSON類型讓它能更容易地處理JSON(這很有效)。

開始前需要做的準(zhǔn)備:

Postgres 9.2+ (as of this blog entry, 9.2 is in beta) - http://www.postgresql.org/ftp/source/

V8 - https://github.com/v8/v8

PLV8 - http://code.google.com/p/plv8js/wiki/PLV8

MongoDB的最低級(jí)別是集合. 集合可以用表來表示:

 

 
  1. CREATE TABLE some_collection ( 
  2. some_collection_id SERIAL NOT NULL PRIMARY KEY
  3. data JSON 
  4. ); 

字符型的JSON 被保存在 Postgres 表里,簡(jiǎn)單易行 (現(xiàn)在看是這樣).

下面實(shí)現(xiàn)自動(dòng)創(chuàng)建集合. 保存在集合表里:

 

 
  1. CREATE TABLE collection ( 
  2. collection_id SERIAL NOT NULL PRIMARY KEY
  3. name VARCHAR 
  4. ); 
  5.  
  6. -- make sure the name is unique 
  7. CREATE UNIQUE INDEX idx_collection_constraint ON collection (name); 

一旦表建好了,就可以通過存儲(chǔ)過程自動(dòng)創(chuàng)建集合. 方法就是先建表,然后插入建表序列.

 

 
  1. CREATE OR REPLACE FUNCTION create_collection(collection varcharRETURNS 
  2. boolean AS $ 
  3. var plan1 = plv8.prepare('INSERT INTO collection (name) VALUES ($1)', [ 'varchar' ]); 
  4. var plan2 = plv8.prepare('CREATE TABLE col_' + collection + 
  5. ' (col_' + collection + '_id INT NOT NULL PRIMARY KEY, data JSON)'); 
  6. var plan3 = plv8.prepare('CREATE SEQUENCE seq_col_' + collection); 
  7.  
  8. var ret; 
  9.  
  10. try { 
  11. plv8.subtransaction(function () { 
  12. plan1.execute([ collection ]); 
  13. plan2.execute([ ]); 
  14. plan3.execute([ ]); 
  15.  
  16. ret = true
  17. }); 
  18. } catch (err) { 
  19. ret = false
  20.  
  21. plan1.free(); 
  22. plan2.free(); 
  23. plan3.free(); 
  24.  
  25. return ret; 
  26. $ LANGUAGE plv8 IMMUTABLE STRICT; 

有了存儲(chǔ)過程,就方便多了:

 

 
  1. SELECT create_collection('my_collection'); 

解決了集合存儲(chǔ)的問題,下面看看MongoDB數(shù)據(jù)解析. MongoDB 通過點(diǎn)式注解方法操作完成這一動(dòng)作:

 

 
  1. CREATE OR REPLACE FUNCTION find_in_obj(data json, key varcharRETURNS 
  2. VARCHAR AS $ 
  3. var obj = JSON.parse(data); 
  4. var parts = key.split('.'); 
  5.  
  6. var part = parts.shift(); 
  7. while (part && (obj = obj[part]) !== undefined) { 
  8. part = parts.shift(); 
  9.  
  10. // this will either be the value, or undefined 
  11. return obj; 
  12. $ LANGUAGE plv8 STRICT; 

上述功能返回VARCHAR,并不適用所有情形,但對(duì)于字符串的比較很有用:

 

 
  1. SELECT data 
  2. FROM col_my_collection 
  3. WHERE find_in_obj(data, 'some.element') = 'something cool' 

除了字符串的比較, MongoDB還提供了數(shù)字類型的比較并提供關(guān)鍵字exists . 下面是find_in_obj() 方法的不同實(shí)現(xiàn):

 

 
  1. CREATE OR REPLACE FUNCTION find_in_obj_int(data json, key varcharRETURNS 
  2. INT AS $ 
  3. var obj = JSON.parse(data); 
  4. var parts = key.split('.'); 
  5.  
  6. var part = parts.shift(); 
  7. while (part && (obj = obj[part]) !== undefined) { 
  8. part = parts.shift(); 
  9.  
  10. return Number(obj); 
  11. $ LANGUAGE plv8 STRICT; 
  12.  
  13. CREATE OR REPLACE FUNCTION find_in_obj_exists(data json, key varcharRETURNS 
  14. BOOLEAN AS $ 
  15. var obj = JSON.parse(data); 
  16. var parts = key.split('.'); 
  17.  
  18. var part = parts.shift(); 
  19. while (part && (obj = obj[part]) !== undefined) { 
  20. part = parts.shift(); 
  21.  
  22. return (obj === undefined ? 'f' : 't'); 
  23. $ LANGUAGE plv8 STRICT; 

接下來是數(shù)據(jù)查詢. 通過現(xiàn)有的材料來實(shí)現(xiàn) find() 方法.

保存數(shù)據(jù)到集合中很簡(jiǎn)單。首先,我們需要檢查JSON對(duì)象并尋找一個(gè)_id值。這部分代碼是原生的假設(shè),如果_id已存在這意味著一個(gè)更新,否則就意味著一個(gè)插入。請(qǐng)注意,我們目前還沒有創(chuàng)建objectID,只使用了一個(gè)序列待其發(fā)生:

 

 
  1. CREATE OR REPLACE FUNCTION save(collection varchar, data json) RETURNS 
  2. BOOLEAN AS $ 
  3. var obj = JSON.parse(data); 
  4.  
  5. var id = obj._id; 
  6.  
  7. // if there is no id, naively assume an insert 
  8. if (id === undefined) { 
  9. // get the next value from the sequence for the ID 
  10. var seq = plv8.prepare("SELECT nextval('seq_col_" + 
  11. collection + "') AS id"); 
  12. var rows = seq.execute([ ]); 
  13.  
  14. id = rows[0].id; 
  15. obj._id = id; 
  16.  
  17. seq.free(); 
  18.  
  19. var insert = plv8.prepare("INSERT INTO col_" + collection + 
  20. " (col_" + collection + "_id, data) VALUES ($1, $2)"
  21. 'int''json']); 
  22.  
  23. insert.execute([ id, JSON.stringify(obj) ]); 
  24. insert.free(); 
  25. else { 
  26. var update = plv8.prepare("UPDATE col_" + collection + 
  27. " SET data = $1 WHERE col_" + collection + "_id = $2"
  28. 'json''int' ]); 
  29.  
  30. update.execute([ data, id ]); 
  31.  
  32. return true
  33. $ LANGUAGE plv8 IMMUTABLE STRICT; 

基于這個(gè)觀點(diǎn),我們可以構(gòu)建一些插入的簡(jiǎn)單文檔:

 

 
  1. "name""Jane Doe"
  2. "address": { 
  3. "street""123 Fake Street"
  4. "city""Portland"
  5. "state""OR" 
  6. }, 
  7. "age": 33 
  8.  
  9. "name""Sarah Smith"
  10. "address": { 
  11. "street""456 Real Ave"
  12. "city""Seattle"
  13. "state""WA" 
  14.  
  15. "name""James Jones"
  16. "address": { 
  17. "street""789 Infinity Way"
  18. "city""Oakland"
  19. "state""CA" 
  20. }, 
  21. "age": 23 

讓我們創(chuàng)建一個(gè)集合并插入一些數(shù)據(jù):

 

 
  1. work=# SELECT create_collection('data'); 
  2. create_collection 
  3. ------------------- 
  4. (1 row) 
  5.  
  6. work=# SELECT save('data''{ our object }'); 
  7. save 
  8. ------ 
  9. (1 row) 

你可以通過檢查“col_data”表的內(nèi)容來查看對(duì)象。

其它翻譯版本(1)

現(xiàn)在我們已經(jīng)有了一些數(shù)據(jù),讓我們?cè)俨樵円幌?。假設(shè)我們想查找住在俄勒岡或華盛頓州年齡大于30的所有人,使用一個(gè)MongoDB風(fēng)格的find():

 

 
  1. "$or": [ 
  2. "address.state""OR" 
  3. }, 
  4. "address.state""WA" 
  5. ], 
  6. "age": { 
  7. "$gt": 30 

因?yàn)樯洗挝覀円呀?jīng)創(chuàng)建了一些深度的包檢測(cè),現(xiàn)在就很容易創(chuàng)建查詢并返回Jane Doe:

 

 
  1. SELECT data 
  2. FROM col_data 
  3. WHERE find_in_obj_int(data, 'age') > 30 
  4. AND ( 
  5. find_in_obj(data, 'address.state') = 'OR' 
  6. OR 
  7. find_in_obj(data, 'address.state') = 'WA' 

我采用了寫一個(gè)遞歸調(diào)用函數(shù)來建立WHERE子句的方法。它有點(diǎn)長(zhǎng),所以我沒有把它貼在這里而是放在GitHub上。一旦find()存儲(chǔ)過程被創(chuàng)建,我們就可以在查詢中使用它。我們應(yīng)該能夠看到Jane Doe被返回:

 

 
  1. work=# SELECT find('data''{ "$or": [ { "address.state": "OR" }, { "address.state": "WA" } ], "age": { "$gt": 30 } }'); 

這樣奏效:它不優(yōu)雅,但它奏效。這是一個(gè)概念的證明,而且?guī)缀鯖]有像它一樣好的可能。我之前曾被問過為什么不使用HSTORE。雖然你可以存儲(chǔ)嵌套的HSTORE和數(shù)組值,但它仍不是JSON,并且不容易通過PLV8操作。這將需要一個(gè)從HSTORE到JSON的序列器,這個(gè)序列器在任何時(shí)間將請(qǐng)求的返回序列化成MongoDB接受的數(shù)據(jù)形式,但依舊太容易在JavaScript中處理。這是次優(yōu)選擇,畢竟我們是要在Postgres的基礎(chǔ)上創(chuàng)建一個(gè)MongoDB的副本。

源碼可以在GitHub上找到:fork并嘗試一下吧,記得回饋哦。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
久久不射中文字幕| 亚洲国产日韩一区无码精品久久久| 国产精品对白刺激久久久| 精品淫伦v久久水蜜桃| 一级黄色在线播放| 香蕉一区二区| 欧美极度另类videos高清| 久久久精品免费免费| 九九九在线观看| 国产成人无吗| 精品免费国产一区二区三区四区| 欧美精品一区二区三区蜜桃视频| 黄污视频在线看| 欧美人与z0zoxxxx特| 亚洲老女人av| 一区二区三区偷拍| 亚洲免费高清| av电影不卡在线观看| 亚洲免费网站在线观看| 成人久久18免费网站图片| 五月婷在线视频| 在线观看成年人视频| 国产精品一区二区不卡视频| 五月婷婷激情网| 成人日韩视频| 亚洲国产日产av| 亚洲精品日韩综合观看成人91| 91精品免费视频| 欧美一区二区三区粗大| 激情se五月| 按摩亚洲人久久| 免费在线一区二区| 日韩有码视频在线| 亚洲涩涩在线| 高清日韩中文字幕| 亚洲a∨精品一区二区三区导航| 亚洲精品中文字幕在线观看| 欧美一区二区三区四区五区| 欧美日韩国产首页在线观看| 亚洲视频在线免费播放| 国产一区二区三区不卡在线观看| 国产精品一区免费在线观看| 成人在线观看免费| 最好看的日本字幕mv视频大全| 一区二区三区国产盗摄| 欧美日韩在线一区二区| 亚洲一区日韩精品中文字幕| 亚洲性猛交xxxxwww| 中文字幕亚洲在线| 一级黄色毛毛片| 在线免费观看黄色小视频| 爽好多水快深点欧美视频| 久久精品视频在线观看| 91精品国产综合久久久久久久久| 欧美三级欧美一级| ass大特写| 国产一区二区三区日韩| 男人通一通女人的下水道| 国产精品sm调教免费专区| 好久没做在线观看| 娇妻被老王脔到高潮失禁视频| www.四虎精品| 91ts人妖另类精品系列| 日韩av手机在线免费观看| 国产一区二区三区四区尤物| 尤物精品国产第一福利三区| 成人国产精品视频| 精品国产一区二区三区噜噜噜| 日韩av无码中文字幕| 久久一区视频| 亚洲综合欧美综合| 99精品欧美一区二区三区小说| 亚欧精品一区二区三区| 日本二区三区视频| www.99.热| 亚洲日本va中文字幕久久| jizzjizzjizz孕妇| http;//www.99re视频| 无套白嫩进入乌克兰美女| 一级视频在线免费观看| 国产精品久久久久一区二区三区共| 美女av免费看| 欧美午夜电影一区| 黑森林国产精品av| 精品一区二区三区中文字幕在线| 国产在线观看精品一区二区三区| 亚欧日韩另类中文欧美| 久久精品一偷一偷国产| 麻豆传媒免费在线观看| 一个人看的www视频在线免费观看| 69精品丰满人妻无码视频a片| 91玉足脚交白嫩脚丫| ww久久中文字幕| 一区二区三区 欧美| 丰满岳乱妇一区二区三区| 日本丶国产丶欧美色综合| 欧美日韩免费做爰大片| 一区二区成人精品| 国产一级特黄a大片免费| 91沈先生播放一区二区| 精品福利免费观看| 国产成人亚洲综合青青| jizzwww| 拔插拔插华人永久免费| 91色在线观看| 精品国产人成亚洲区| 日韩免费一级| 男人日女人下面视频| 欧美无毛视频| 色综合亚洲图丝熟| 午夜激情福利电影| 欧美一区二区三区系列电影| 黑粗硬大欧美视频| 丝袜理论片在线观看| 国产成+人+亚洲+欧美+综合| 亚洲精品一区二区三| 日本.亚洲电影| 两个人免费视频观看日本| 午夜电影一区二区| 黄色三级免费电影| 午夜精品久久久久久久无码| 午夜欧美大尺度福利影院在线看| 91久色porny| 亚洲国产精品一| 在线观看久久久久久| 日本dvd播放| 99这里都是精品| 国产永久免费高清在线观看| gogo人体一区| 国产精品免费丝袜| 空姐吹箫视频大全| 久久99免费视频| 91精品中国老女人| 日本aⅴ大伊香蕉精品视频| 国产精品免费av| 久久精品99久久久香蕉| 超碰福利在线观看| 日韩一区二区三区高清在线观看| 国产一区二区三区四区hd| 日本黄网站色大片免费观看| 2024短剧网剧在线观看| jizz在亚洲| 亚洲av无码一区二区三区网址| 欧洲色大大久久| 国产日本一区二区| 国产精品永久入口久久久| 亚洲最大的黄色网| 四虎精品影院在线观看视频| 日本泡妞xxxx免费视频软件| 欧美日韩xxxx| 一区二区三区www污污污网站| 91国拍精品国产粉嫩亚洲一区| 77777亚洲午夜久久多人| 亚洲无码精品在线观看| 中文字幕二三区不卡| 亚洲美女中文字幕| 国产又粗又猛又爽又黄91精品| 日韩专区在线| 久久亚洲美女| 久久99精品久久久水蜜桃| 久久久久免费视频| 欧美一区二区视频网站| 国产一区二区女内射| 国产一区香蕉久久| 亚洲卡通欧美制服中文| 伊人色综合久久天天| 久久精品一区二区不卡| 欧美日韩精品一区二区在线播放| 91骚色在线| 国产精品久久久久一区| 一个人看的www片免费高清视频| 欧美成人精品激情在线观看| 91黄色在线观看| 亚洲成人国产精品| 欧美在线国产精品| 久久人妻少妇嫩草av蜜桃| 久久久久日韩精品久久久男男| 亚洲高清免费在线观看| 999国产精品一区| 婷婷久久免费视频| 俺去俺来也在线www色官网| 亚洲电影免费观看高清完整版在线观看| 国产精东传媒成人av电影| 色婷婷色综合| japanese23hdxxxx日韩| 精品一区二区免费视频| 日韩色级片先锋影音| 一区二区视频在线看| 少妇精品视频一区二区| 欧美精品在线观看播放| 亚洲一级Av无码毛片久久精品| www.91av.cn| 热国产热中文视频二区| 国产系列精品av| 中文字幕av久久爽一区| www.中文字幕| 性金发美女69hd大尺寸| 在线播放91| 在线免费视频一区| 国产一区二区三区在线观看网站| 黄色成人免费观看| www在线看| www.天堂av.com| 女同一区二区| 日韩精品一卡| 日本亚洲最大的色成网站www| 美女福利网站视频在线观看| 成人免费视频入口| 国产日韩欧美高清免费| 欧美超级乱淫片喷水| 91偷拍与自偷拍精品| 成全电影大全在线观看| 日韩av在线免播放器| 青青青视频在线播放| 一区二区三区导航| 国产欧美在线观看| 亚洲少妇久久久| 日本福利在线观看| av官网在线观看| 五月天亚洲一区| 91成人在线精品视频| 九九久久免费视频| 欧美自拍偷拍午夜视频| 五月天国产在线| 日韩视频在线直播| 亚洲欧美中文字幕| 美女视频一区二区三区| 极品国产91在线网站| 国产性生活免费视频| 在线成年人视频| 制服丝袜亚洲精品中文字幕| 欧洲女同同性吃奶| 天使萌一区二区三区免费观看| 国产日本欧美一区二区三区| 精品裸体舞一区二区三区| 91影院未满十八岁禁止入内| 久久99国产精一区二区三区| 国产超碰精品在线观看| 日本高清不卡视频| 你懂的免费视频| a美女胸又www黄视频久久| 久久精品最新地址| 91玉足脚交嫩脚丫在线播放| 99热久久这里只有精品| 日本强好片久久久久久aaa| 黄色精品一区二区| 经典三级一区二区三区视频| 午夜国产精品理论片久久影院| 四虎影视精品成人| 日韩精品亚洲人成在线观看| 欧美成人毛片| 久久天天东北熟女毛茸茸| 人人在草线视频在线观看| 精品久久人妻av中文字幕| 国产亚洲视频系列| 人妻无码中文字幕免费视频蜜桃| 校园激情久久| 亚洲免费观看高清完整版在线观看| 国产原创中文av| 亚洲国产高清视频| 在线看视频你懂得| 色综合视频在线| 欧美日本韩国一区二区三区视频| 久久精品青青大伊人av| 另类一区二区| 又黄又爽又色视频| 午夜免费性福利| 国产黄色三级网站| 精品国产成人系列| 超碰人人人人人人| www.com毛片| 自拍偷拍亚洲天堂| 天堂网站www天堂资源在线| 日韩高清国产精品| 国产二区视频| 男插女视频久久久| 欧美性极品xxxx娇小| 无码人妻一区二区三区在线| 狠狠人妻久久久久久综合| 特级丰满少妇一级aaaa爱毛片| 国产精品久久久久久久一区探花| 国模吧精品视频| 欧美高清在线一区二区| 成人免费av电影| 国产成人在线视频免费观看| 一级特黄妇女高潮| 中国女人一级一次看片| 一区二区三区在线观看www| 96pao国产成视频永久免费| 18在线观看的| 好看不卡的中文字幕| 美女18一级毛片一品久道久久综合| 欧美男女性生活在线直播观看| 爱爱爱免费视频在线观看| 午夜成人在线视频| 久久99精品久久久久久欧洲站| www.97av.com| 国产福利电影网| 亚洲熟妇无码乱子av电影| 五级黄高潮片90分钟视频| 黄色网址在线免费看| 久久中文字幕免费| 成人a视频在线| 日本三级韩国三级欧美三级| 91p0rn永久地址| 日韩高清欧美激情| 中国字幕a在线看韩国电影| 国产精品老牛影院在线观看| 国产精品一区二区三区四区色| 热re66久久精品国产99re| 性做久久久久久久免费看| 国产精品电影一区二区三区| 久久久久成人精品免费播放动漫| 日韩**中文字幕毛片| 91精品国产色综合久久ai换脸| 又黄又爽无遮挡| 国产一区二区久久久| 啊啊啊啊啊好爽| 九色porny自拍视频在线播放| 免费看成人午夜电影| 91福利免费| 久久久久久久久99精品| 天天躁日日躁狠狠躁伊人| 亚洲欧美精品中文第三| 亚洲精品国产福利| 中文字幕乱码人妻综合二区三区| 麻豆精品精品国产自在97香蕉| 性做久久久久久久|