在 Postgres 里克隆一个 MongoDB
Jun 07, 2016 pm 04:48 PMPostgres 社区在 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]
更多详情见请继续阅读下一页的精彩内容:

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Quelle version est généralement utilisée pour mongodb ?

Partage d'expérience sur la mise en œuvre d'un système de recommandation en temps réel à l'aide de MongoDB

Quels sont les avantages de la base de données MongoDB

Où est la base de données créée par mongodb ?

Où sont les fichiers de la base de données mongodb ?
