字符型的JSON 被保存在 Postgres 表里,简单易行 (现在看是这样).
下面实现自动创建集合. 保存在集合表里:
一旦表建好了,就可以通过存储过程自动创建集合. 方法就是先建表,然后插入建表序列.
有了存储过程,就方便多了:
解决了集合存储的问题,下面看看MongoDB数据解析. MongoDB 通过点式注解方法操作完成这一动作:
上述功能返回VARCHAR,并不适用所有情形,但对于字符串的比较很有用:
除了字符串的比较, MongoDB还提供了数字类型的比较并提供关键字exists . 下面是find_in_obj() 方法的不同实现:
接下来是数据查询. 通过现有的材料来实现 find() 方法. 保存数据到集合中很简单。首先,我们需要检查JSON对象并寻找一个_id值。这部分代码是原生的假设,如果_id已存在这意味着一个更新,否则就意味着一个插入。请注意,我们目前还没有创建objectID,只使用了一个序列待其发生:
基于这个观点,我们可以构建一些插入的简单文档:
让我们创建一个集合并插入一些数据:
你可以通过检查“col_data”表的内容来查看对象。
其它翻译版本(1)
现在我们已经有了一些数据,让我们再查询一下。假设我们想查找住在俄勒冈或华盛顿州年龄大于30的所有人,使用一个MongoDB风格的find():
因为上次我们已经创建了一些深度的包检测,现在就很容易创建查询并返回Jane Doe:
我采用了写一个递归调用函数来建立WHERE子句的方法。它有点长,所以我没有把它贴在这里而是放在GitHub上。一旦find()存储过程被创建,我们就可以在查询中使用它。我们应该能够看到Jane Doe被返回:
这样奏效:它不优雅,但它奏效。这是一个概念的证明,而且几乎没有像它一样好的可能。我之前曾被问过为什么不使用HSTORE。虽然你可以存储嵌套的HSTORE和数组值,但它仍不是JSON,并且不容易通过PLV8操作。这将需要一个从HSTORE到JSON的序列器,这个序列器在任何时间将请求的返回序列化成MongoDB接受的数据形式,但依旧太容易在JavaScript中处理。这是次优选择,毕竟我们是要在Postgres的基础上创建一个MongoDB的副本。
源码可以在GitHub上找到:fork并尝试一下吧,记得回馈哦。