>데이터 베이스 >MySQL 튜토리얼 >在 Postgres 里克隆一个 MongoDB

在 Postgres 里克隆一个 MongoDB

WBOY
WBOY원래의
2016-06-07 16:48:02938검색

Postgres 社区在 NoSQL采取一系列动作后并没有坐以待毙. Postgres一直在进步: 集成了 JSON和 PLV8. PLV8 引入了 V8 Javascript引

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

Postgres 社区在 NoSQL采取一系列动作后并没有坐以待毙. Postgres一直在进步: 集成了 JSON和 PLV8. PLV8 引入了 V8 Javascript引擎 . 操作 JSON也更简单了 (需要验证).

开始前需要做的准备:

  • Postgres 9.2+ (as of this blog entry, 9.2 is in beta) -

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

  • PLV8 -

  • MongoDB的最低级别是集合. 集合可以用表来表示:

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

    字符型的JSON 被保存在 Postgres 表里,简单易行 (现在看是这样).

    下面实现自动创建集合. 保存在集合表里:

        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);

    一旦表建好了,,就可以通过存储过程自动创建集合.  方法就是先建表,然后插入建表序列.

        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;

    有了存储过程,就方便多了:

        SELECT create_collection('my_collection');

    解决了集合存储的问题,下面看看MongoDB数据解析. MongoDB 通过点式注解方法操作完成这一动作:

        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,并不适用所有情形,但对于字符串的比较很有用:

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

    除了字符串的比较, MongoDB还提供了数字类型的比较并提供关键字exists .  下面是find_in_obj() 方法的不同实现:

        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;

    接下来是数据查询.  通过现有的材料来实现 find() 方法.

    相关阅读:

    CentOS编译安装MongoDB

    CentOS 编译安装 MongoDB与mongoDB的php扩展

    CentOS 6 使用 yum 安装MongoDB及服务器端配置

    Ubuntu 13.04下安装MongoDB2.4.3

    MongoDB入门必读(概念与实战并重)

    《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

     

    更多详情见请继续阅读下一页的精彩内容:

    linux

    성명:
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.