在 Postgres 里克隆一个 MongoDB

php中文网
发布: 2016-06-07 16:48:02
原创
1132人浏览过

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 通过点式注解方法操作完成这一动作:

    JTBC网站内容管理系统
    JTBC网站内容管理系统

    JTBC网站内容管理系统是一套可对现有模块进行扩充与克隆的网站系统核心,采用UTF-8编码,采取 语言-代码-程序两两分离的技术模式,全面使用了模板包与语言包结构,为用户的修改提供方便,网站内容的每一个角落都可以在后台予以管理,是一套非常适合用做系统建站或者进行二次开发的程序核心

    JTBC网站内容管理系统 71
    查看详情 JTBC网站内容管理系统

        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

    相关标签:
    最佳 Windows 性能的顶级免费优化软件
    最佳 Windows 性能的顶级免费优化软件

    每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

    下载
    来源:php中文网
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    最新问题
    开源免费商场系统广告
    热门教程
    更多>
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送
    PHP中文网APP
    随时随地碎片化学习

    Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号