Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理MongoDB中的模式更改_Java_Mongodb_Views_Schema - Fatal编程技术网

Java 处理MongoDB中的模式更改

Java 处理MongoDB中的模式更改,java,mongodb,views,schema,Java,Mongodb,Views,Schema,我在一个Java项目中使用MongoDB。在DB模式更改后,我发现自己在许多地方修改了现有代码,以执行以下更改: Object result = collection.findOne(); 到 现在,在findOne()案例中,事情相对简单,但是当find()和相关的游标开始运行时,事情会变得更复杂 在大多数情况下,如果我可以修改查询,而不是它的结果,那会容易得多。我已经做过实验,但据我所知,这只会掩盖其余的领域-它不会改变对象的结构 是否可以指定一个查询,以便将构成特定字段值的对象“升级”

我在一个Java项目中使用MongoDB。在DB模式更改后,我发现自己在许多地方修改了现有代码,以执行以下更改:

Object result = collection.findOne();

现在,在
findOne()
案例中,事情相对简单,但是当
find()
和相关的游标开始运行时,事情会变得更复杂

在大多数情况下,如果我可以修改查询,而不是它的结果,那会容易得多。我已经做过实验,但据我所知,这只会掩盖其余的领域-它不会改变对象的结构

  • 是否可以指定一个查询,以便将构成特定字段值的对象“升级”为顶级对象,从而删除
    .get(“this”).get(“that”)
    调用

  • 作为进一步的步骤,MongoDB是否支持任何与传统数据库中相同的功能?在模式更改的情况下允许现有代码继续工作的东西


    • 第二个问题的答案可能是一个Map/Reduce函数。但是,有一些考虑因素:

      • Map/Reduce通常用于进行聚合计算,但可以用作视图,因为它将遍历集合中的每个对象,并将生成一个输出集合,在该集合中对文档进行聚合(计数、求和等)或转换(对于每个文档,如果存在此字段,则返回此字段,否则返回该字段)

      • >p>它运行在服务器上,这样您就可以安排作业生成集合(表示视图的概念);但是,您需要考虑MapReduce对于在线查询不好。它旨在做后台作业以高效地转换数据,而不是运行查询(除非您只有一个小的集合)。

      因此,我想补充一点,如果您想“迁移”您的模式,您可以运行map/reduce并将其保存为具有新模式的新永久集合。继续针对新模式编程所需做的就是使用新集合。

      MongoDB目前似乎没有任何与关系数据等效的服务器端数据基本视图。显然,它只适用于批处理操作,这使得它对于具有实时更新的在线数据库毫无用处

      作为一种解决方法,我转向了客户端解决方案。我利用了Java驱动程序是开源的这一事实,因此我可以很容易地确定它的结构


      更具体地说,我能够为感兴趣的集合扩展和默认BSON解码器,并透明地重新定位已移动的字段。

      您是否考虑过更新集合,以便将此字段值复制到ThatField属性?是否有向后兼容的理由来保留旧属性保留其原始名称?@jtoberson:存储和维护重复字段是一场噩梦-我必须确保所有数据库更新都会做正确的事情,即更新两个字段,而不仅仅是其中一个。更不用说新旧模式之间可能发生冲突了…@jtoberson:我有很多代码没有编写保持模式的兼容性,会让我有时间正确地重构它,而不是现在就必须执行大量的修补工作。如果失败了,修改查询比在代码中找到结果弹出的位置并在那里修改代码更容易…当然,你不应该同时保留这两个。Actually,我想建议你完全删除旧字段。要删除旧字段,不是很简单,只要搜索“ThisField”的所有用法并用“ThatField”替换它们就可以了吗?
      Object result = collection.findOne().get("ThisField").get("ThatField");