Welcome 微信登录

首页 / 数据库 / MySQL / 在 Postgres 里克隆一个 MongoDB

世上本没有路,走的人多了也就成了路。为什么不能在 Postgres上建一个MongoDB 呢?Postgres 社区在 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的最低级别是集合. 集合可以用表来表示:    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 http://www.linuxidc.com/Linux/2012-02/53834.htmCentOS 编译安装 MongoDB与mongoDB的php扩展 http://www.linuxidc.com/Linux/2012-02/53833.htmCentOS 6 使用 yum 安装MongoDB及服务器端配置 http://www.linuxidc.com/Linux/2012-08/68196.htmUbuntu 13.04下安装MongoDB2.4.3 http://www.linuxidc.com/Linux/2013-05/84227.htmMongoDB入门必读(概念与实战并重) http://www.linuxidc.com/Linux/2013-07/87105.htm《MongoDB 权威指南》(MongoDB: The Definitive Guide)英文文字版[PDF] http://www.linuxidc.com/Linux/2012-07/66735.htm 更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-04/100929p2.htm
  • 1
  • 2
  • 下一页
Oracle联机重做日志丢失的恢复MySQL-5.6+MySQL-Proxy构建主从复制与读写分离相关资讯      MongoDB  Postgres 
  • MongoDB 3.3.0 发布下载  (01月14日)
  • 使用MongoDB C#官方驱动操作  (12/31/2015 16:27:56)
  • CentOS 6.6下安装MongoDB 3.0.1  (12/21/2015 19:29:02)
  • MongoDB 3.2版WiredTiger存储引擎  (01月02日)
  • 进程监控工具Supervisor 启动  (12/26/2015 10:49:57)
  • MongoDB 3.2.1 RC0 发布下载  (12/18/2015 11:32:29)
本文评论 查看全部评论 (0)
表情: 姓名: 字数