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

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

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

2020-10-29 21:49:53
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

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

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

開(kāi)始前需要做的準(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í)別是集合.  集合可以用表來(lái)表示:
 

  CREATE TABLE some_collection (   some_collection_id SERIAL NOT NULL PRIMARY KEY,   data JSON  );

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

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

  CREATE TABLE collection (   collection_id SERIAL NOT NULL PRIMARY KEY,   name VARCHAR  );   -- make sure the name is unique  CREATE UNIQUE INDEX idx_collection_constraint ON collection (name);

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

 CREATE OR REPLACE FUNCTION create_collection(collection varchar) RETURNS  boolean AS $$   var plan1 = plv8.prepare('INSERT INTO collection (name) VALUES ($1)', [ 'varchar' ]);   var plan2 = plv8.prepare('CREATE TABLE col_' + collection +    ' (col_' + collection + '_id INT NOT NULL PRIMARY KEY, data JSON)');   var plan3 = plv8.prepare('CREATE SEQUENCE seq_col_' + collection);      var ret;      try {    plv8.subtransaction(function () {     plan1.execute([ collection ]);     plan2.execute([ ]);     plan3.execute([ ]);         ret = true;    });   } catch (err) {    ret = false;   }      plan1.free();   plan2.free();   plan3.free();      return ret;  $$ LANGUAGE plv8 IMMUTABLE STRICT;

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

 SELECT create_collection('my_collection');


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

  CREATE OR REPLACE FUNCTION find_in_obj(data json, key varchar) RETURNS  VARCHAR AS $$   var obj = JSON.parse(data);   var parts = key.split('.');      var part = parts.shift();   while (part && (obj = obj[part]) !== undefined) {    part = parts.shift();   }      // this will either be the value, or undefined   return obj;  $$ LANGUAGE plv8 STRICT;

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

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

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

  CREATE OR REPLACE FUNCTION find_in_obj_int(data json, key varchar) RETURNS  INT AS $$   var obj = JSON.parse(data);   var parts = key.split('.');      var part = parts.shift();   while (part && (obj = obj[part]) !== undefined) {    part = parts.shift();   }      return Number(obj);  $$ LANGUAGE plv8 STRICT;     CREATE OR REPLACE FUNCTION find_in_obj_exists(data json, key varchar) RETURNS  BOOLEAN AS $$   var obj = JSON.parse(data);   var parts = key.split('.');      var part = parts.shift();   while (part && (obj = obj[part]) !== undefined) {    part = parts.shift();   }      return (obj === undefined ? 'f' : 't');  $$ LANGUAGE plv8 STRICT;

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

  CREATE OR REPLACE FUNCTION save(collection varchar, data json) RETURNS  BOOLEAN AS $$   var obj = JSON.parse(data);    var id = obj._id;    // if there is no id, naively assume an insert   if (id === undefined) {    // get the next value from the sequence for the ID    var seq = plv8.prepare("SELECT nextval('seq_col_" +      collection + "') AS id");    var rows = seq.execute([ ]);        id = rows[0].id;    obj._id = id;     seq.free();       var insert = plv8.prepare("INSERT INTO col_" + collection +      " (col_" + collection + "_id, data) VALUES ($1, $2)",      [ 'int', 'json']);     insert.execute([ id, JSON.stringify(obj) ]);    insert.free();   } else {    var update = plv8.prepare("UPDATE col_" + collection +     " SET data = $1 WHERE col_" + collection + "_id = $2",     [ 'json', 'int' ]);     update.execute([ data, id ]);   }    return true;  $$ LANGUAGE plv8 IMMUTABLE STRICT;

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

  {   "name": "Jane Doe",   "address": {    "street": "123 Fake Street",    "city": "Portland",    "state": "OR"   },   "age": 33  }     {   "name": "Sarah Smith",   "address": {    "street": "456 Real Ave",    "city": "Seattle",    "state": "WA"   }  }     {   "name": "James Jones",   "address": {    "street": "789 Infinity Way",    "city": "Oakland",    "state": "CA"   },   "age": 23  }

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

 

  work=# SELECT create_collection('data');   create_collection  -------------------   t  (1 row)     work=# SELECT save('data', '{ our object }');   save  ------   t  (1 row)

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

其它翻譯版本(1)

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

  {   "$or": [    {     "address.state": "OR"    },    {     "address.state": "WA"    }   ],   "age": {    "$gt": 30   }  }

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

  SELECT data   FROM col_data   WHERE find_in_obj_int(data, 'age') > 30    AND (       find_in_obj(data, 'address.state') = 'OR'      OR       find_in_obj(data, 'address.state') = 'WA'      )

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

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

這樣奏效:它不優(yōu)雅,但它奏效。這是一個(gè)概念的證明,而且?guī)缀鯖](méi)有像它一樣好的可能。我之前曾被問(wèn)過(guò)為什么不使用HSTORE。雖然你可以存儲(chǔ)嵌套的HSTORE和數(shù)組值,但它仍不是JSON,并且不容易通過(guò)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ā)表
欧美制服丝袜第一页| 强乱中文字幕av一区乱码| 91亚洲精品丁香在线观看| 国产色综合天天综合网| 色综合.com| 国产午夜精品一区二区理论影院| 欧美激情导航| 国产精品久久久久久久app| 在线观看国产小视频| 亚洲理论在线a中文字幕| 国产盗摄视频一区二区三区| theporn国产在线精品| 岛国毛片av在线| 青青操免费在线视频| 午夜在线成人av| 亚洲每日在线| 在线不卡一区二区三区| 97se亚洲国产综合自在线| 国产野外战在线播放| 国产精品美女一区二区在线观看| 欧美a级成人淫片免费看| 国产女主播福利| 亚洲伊人伊成久久人综合网| 色综合色狠狠综合色| 综合欧美亚洲| 精品国产一区二区三区在线| 精品人伦一区二区色婷婷| av女优在线| 国产精品边吃奶边做爽| 久久美女高清视频| 久久中文字幕二区| 91免费人成网站在线观看18| 国产精品网站在线播放| 亚洲视频网在线直播| 国产精品白嫩白嫩大学美女| 天天综合天天综合| 日本暖暖在线视频| 久久mv成人精品亚洲动漫| 国产免费一区| 久久久久一区二区三区| 成人精品一二三区| 啊v视频在线| 国产激情一区二区三区| 亚洲电影观看| 91丝袜美腿高跟国产极品老师| 日韩电影大全在线观看| 色中色综合网| 亚洲一区二区三区免费| 国产一区二区三区欧美| 国产免费av一区二区三区| 日本一区二区在线播放| 日韩电影在线观看一区二区| 亚洲天堂日韩在线| 一区二区欧美国产| 丝袜免费视频| 国模精品视频一区二区三区| 国产成人无吗| 精品人妻无码一区二区三区| 国产av一区二区三区| xxxxx在线观看| 午夜av免费观看| 亚洲视频一二三区| 中文字幕久久久| 电影一区电影二区| 日本一区二区三区中文字幕| jizz日本18| 九九热只有精品| 波多野结衣一区二区三区在线观看| 国产成人av网| www.91视频.com| 精品街拍一区二区| 国产女人18毛片| 天天干天天摸天天操| 在线观看色网站| 岛国视频一区免费观看| 日本成人免费在线观看| 一级欧洲+日本+国产| eeuss影院www免费视频| 国产精品综合一区二区| 久久精品国产秦先生| 中文字幕在线播放网址| 久久噜噜色综合一区二区| 亚洲一区二区三区日本久久九| 国产精品探花在线观看| 这里只有精品9| 亚洲欧美日韩国产精品| 免费一级淫片aaa片毛片a级| 欧美精品偷拍| 亚洲五码在线| 精品国产鲁一鲁一区二区三区| 中文字幕视频在线播放| 免费一级片视频| 国产亚洲欧美在线视频| 国产精品久久99久久| 在线影院av| 欧美亚洲国产日本| 日韩高清dvd碟片| 丰满人妻一区二区三区四区| 久久久久久久久网| 天堂一区二区在线免费观看| 欧美午夜片欧美片在线观看| 久久一级电影| 欧美精品在欧美一区二区少妇| 中国人体摄影一区二区三区| 2021久久精品国产99国产精品| 亚洲午夜视频在线观看| 国产精品一区亚洲| 亚洲精品福利网站| 精品国产凹凸成av人网站| 欧美xxxx性xxxxx高清| 日日摸夜夜添夜夜添国产精品| 91高清免费在线观看| 激情视频免费在线| 不卡一区在线观看| 一本一本久久a久久综合精品蜜桃| 久久久久久久久久久久久久av| 少妇精品高潮欲妇又嫩中文字幕| 精品人伦一区二区三区蜜桃网站| 中文字幕一区免费在线观看| 亚洲三级影院| 91视频免费版污| 国产精品三上| 不卡av播放| 中文字幕一区二区三区欧美日韩| 国产二级片在线观看| 91精品国产91久久久久久三级| 香蕉伊大人中文在线观看| 在线成人www免费观看视频| 成人一区不卡| 国产91精品精华液一区二区三区| 欧美理论片在线播放| 麻豆一区二区三区在线观看| 91精品国产自产在线丝袜啪| 亚洲午夜在线| 高清中文字幕一区二区三区| 国产中文字幕二区| 大奶一区二区三区| 亚洲国产精久久久久久| 美女扒开腿免费视频| 风间由美性色一区二区三区四区| 一色桃子久久精品亚洲| 亚洲va久久久噜噜噜久久狠狠| 日本一区精品| 亚洲日本在线视频观看| 日本黄色小视频在线观看| 高清一区在线观看| 久久久久久美女| 国产欧美日韩中文| 26uuu久久天堂性欧美| 欧美日韩国产综合网| 久久一本综合频道| 丝瓜app色版网站观看| 91精品国产综合久久福利| 麻豆tv在线观看| 97caocao| 免费观看a级片| 人妻少妇精品无码专区久久| 久久久久免费精品国产| 中文字幕视频网| 亚洲AV无码成人精品一区| 成人天堂yy6080亚洲高清| 麻豆传传媒久久久爱| 国产伦精品一区二区三区视频痴汉| 青青草国产精品97视觉盛宴| 国产精品国产亚洲精品看不卡15| 欧美三级在线视频| 亚洲欧洲日产国产综合网| 91精品国产91久久| 欧美性xxxx极品hd欧美| 国产日韩欧美自拍| 挪威xxxx性hd极品| 久久91精品国产| 一区二区三区视频观看| 国产三级精品在线| 任你躁在线精品免费| 成人黄色一区二区| wwww国产精品欧美| 亚洲欧美综合图片| 国产精品亚洲综合在线观看| 999视频精品| 91精品国产乱码久久久久久| 污污的视频免费观看| 亚洲盗摄视频| 欧美一区二区在线免费播放| www在线免费观看视频| а√资源新版在线天堂| av福利精品导航| 青青在线观看视频中文字| 狼人精品一区二区三区在线| 欧美性猛交xxxx黑人猛交| 欧美丰满少妇xxxxx做受| 亚洲熟妇无码av在线播放| 伊人国产精品| 精品美女一区二区三区| 在线资源免费观看| 亚洲国产婷婷香蕉久久久久久| 欧美自拍小视频| 美女亚洲精品| 国产欧美精品va在线观看| 成人免费一区| 亚洲人成在线影院| 蜜桃传媒视频第一区入口在线看| 国产成人精品一区| 黄在线观看在线播放720p| 成人精品免费在线观看| 欧美人妻一区二区三区| av网站在线免费看推荐| 91精品国产色综合久久不卡蜜臀| 国产精品全国免费观看高清| 国产精品久久7| a级影片在线观看| 一区二区三区四区视频精品免费| 在线免费亚洲电影| 精品一区二区三区免费看| 日本精品免费一区二区三区| 福利写真视频网站在线| 精品国产制服丝袜高跟| 国产精品女主播| 福利电影在线| 日本国产精品视频| 久久久久久久高清| 色综合久久综合网| 一级成人国产| 亚洲奶汁xxxx哺乳期| 婷婷伊人五月天| 国产大片一区| av在线中出| 久久香蕉国产线看观看网| 欧美日韩高清一区| 日本高清不卡一区| 少妇高潮毛片色欲ava片| 国产精品毛片久久久久久久av| 一级特黄aa大片| 成人毛片一区二区三区| 日日摸夜夜添夜夜添国产精品| 喷水视频在线观看| 亚洲精品久久久久久久久久久| 欧美高清视频| 色婷婷一区二区三区四区| 91香蕉视频污| 污污网站在线观看视频| 91在线一区二区| 美女网站一区| 亚洲欧洲中文| 91精品国产91久久综合桃花| 欧美精品一区二区三| 最新黄色网址在线观看| 国产精品美女www爽爽爽视频| 亚洲欧美电影院| 久久久人成影片一区二区三区在哪下载| 精品国产乱码久久久久久久久| 日本中文字幕二区| 国产综合一区二区| 在线观看视频黄色| 日韩在线精品强乱中文字幕| 波多野结衣国产精品| 欧美另类99xxxxx| silk一区二区三区精品视频| 在线天堂www在线国语对白| 免费黄频在线观看| 久久嫩草捆绑紧缚| 天天综合网久久综合网| 亚洲福利在线观看视频| 久久精品香蕉视频| 奇米成人av国产一区二区三区| 免费做暖暖免费观看日本| 国产91精品一区| 福利视频理论电影| 久久综合狠狠综合久久激情| 999久久久精品视频| 中文字幕一区二区三区人妻电影| 国产美女高潮视频| 日韩一卡二卡三卡| 国产黄色片在线播放| 亚洲三区四区| 韩国av一区| 欧美久久久精品| 狂野欧美xxxx韩国少妇| 国产精品伦理一区二区| 亚洲视频网站在线观看| 国产真人真事毛片视频| 午夜在线观看视频网站| 中文字幕av在线一区二区三区| 午夜国产在线观看| 成人激情黄色小说| 日韩一级视频| 亚洲欧美制服综合另类| 亚洲日本丝袜连裤袜办公室| 欧美一区二区三区不卡| 强制高潮抽搐sm调教高h| 无码精品一区二区三区在线| 国产精品人人做人人爽| 久久精品免费网站| 国产乱码久久久久久| 午夜国产福利| 国内精品卡一卡二卡三| 不用播放器的免费av| 欧美国产一区二区三区| www.日本在线视频| 久久丫精品国产亚洲av不卡| 精品少妇一区二区三区日产乱码| 欧美xxxxxxxxx| 国产成人在线中文字幕| 成人亚洲欧美激情在线电影| 色婷婷在线视频| 亚洲色成人www永久网站| www.尤物.com| 欧美亚洲免费在线| 波多野结衣免费观看| 一级黄色片在线观看| 久久69国产一区二区蜜臀| 国产精品无码久久久久| 亚洲国产一区二区久久| 天天综合网站| 久久久精品国产sm调教| 91高清在线视频| 黑人と日本人の交わりビデオ| 亚洲 小说区 图片区 都市| 男人天堂综合网| 麻豆传媒在线免费| 亚洲人成网站影音先锋播放| 国产亚洲精品久久久久久豆腐| 日本免费高清一区二区| 成人性做爰aaa片免费看不忠| 久久夜色精品亚洲| 亚洲精品孕妇| 黄网站app在线观看大全免费视频| 国产原厂视频在线观看|