世上本没有路,走的人多了也就成了路。为什么不能在 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
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)