日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在Postgres里克隆一個MongoDB

世上本沒有路,走的人多了也就成了路。為什么不能在 Postgres上建一個MongoDB 呢?

Postgres 社區(qū)在 NoSQL采取一系列動作后并沒有坐以待斃.  Postgres一直在進步: 集成了 JSON和 PLV8.  PLV8 引入了 V8 Javascript引擎 . 操作 JSON也更簡單了 (需要驗證).

開始前需要做的準備:

  • 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的最低級別是集合.  集合可以用表來表示:

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

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

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

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

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

 
 
  1. CREATE OR REPLACE FUNCTION create_collection(collection varchar) RETURNS
  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.   var ret;
  8.   try {
  9.     plv8.subtransaction(function () {
  10.       plan1.execute([ collection ]);
  11.       plan2.execute([ ]);
  12.       plan3.execute([ ]);
  13.   
  14.       ret = true;
  15.     });
  16.   } catch (err) {
  17.     ret = false;
  18.   }
  19.   plan1.free();
  20.   plan2.free();
  21.   plan3.free();
  22.   return ret;
  23. $$ LANGUAGE plv8 IMMUTABLE STRICT;

有了存儲過程,就方便多了:

 
 
  1. SELECT create_collection('my_collection');

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

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

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

 
 
  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() 方法的不同實現(xiàn):

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

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

#p#

在本部分中將覆蓋保存數(shù)據(jù)以及從MongDB查詢中構(gòu)建WHERE從句,以便檢索我們已經(jīng)寫入的數(shù)據(jù)。

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

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

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

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

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

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

英文原文:Building a MongoDB Clone in Postgres: Part 1

譯文鏈接:http://www.oschina.net/translate/building_a_mongodb_clone_in_postgres_part_1


名稱欄目:在Postgres里克隆一個MongoDB
URL地址:http://m.5511xx.com/article/cocohpg.html