我在我的一个Java项目中使用MongoDB。在更改了数据库模式之后,我发现自己在许多地方修改现有代码来执行更改,例如:
Object result = collection.findOne();
到
Object result = collection.findOne().get("ThisField").get("ThatField");
现在,在findOne()
情况下事情相对简单,但是当find()
和相关游标发挥作用时它们变得更加复杂。
在大多数情况下,如果我可以修改查询而不是其结果,那将会容易得多。我已经尝试过retrieving specfic fields only,但据我所知,它只掩盖其余的字段 - 它不会改变对象的结构。
是否可以指定查询,以便将形成特定字段值的对象“提升”为顶级对象,从而删除.get("this").get("that")
次调用?
作为进一步的步骤,MongoDB是否支持views的任何等价物,如传统数据库中所见?什么可能允许现有代码在架构更改的情况下继续工作?
答案 0 :(得分:2)
似乎MongoDB当前没有任何服务器端等效的关系数据库视图。 MongoDB Map/Reduce support显然只适用于批处理操作,这使得对于具有实时更新的在线数据库毫无用处。
作为一种解决方法,我转向客户端解决方案。我利用了Java驱动程序是开源的这一事实,因此我可以很容易地弄清楚它是如何构建的。
更具体地说,我能够为感兴趣的集合扩展和replace默认的BSON解码器,并透明地重新定位已移动的字段。
答案 1 :(得分:0)
第二个问题的答案可能是 Map / Reduce 功能。但是,有一些注意事项:
Map / Reduce通常用于聚合计算,但可以用作View,因为它将遍历集合中的每个对象,并生成一个汇总文档的输出集合(计数, sums等)或转换(为每个文档,如果存在ThisField则返回ThisField,否则返回ThatField )
它在服务器上运行,因此您可以安排作业以生成集合(表示视图的概念);但是,您需要考虑MapReduce不适合在线查询。它旨在进行后台作业以非常有效地转换数据,但不能运行查询(除非您只有一个小集合)。
所以我想补充一点,如果你想'迁移'你的模式,你可以运行map / reduce并将其保存为新模式的新永久集合。要继续针对新模式进行编程,您只需使用新集合即可。