导入/导出Mongo集合,保留_id

时间:2016-02-17 21:08:07

标签: mongodb mongoose

我有一个MEAN数据库应用程序,其中包含许多通过ObjectId具有层次关系的Mongo集合。应用程序的副本在本地脱机工作,另一个副本在生产服务器上运行。

数据包含共同描述驱动复杂过程的规则和内容。这些数据需要离线输入,以便在数据进入生产环境之前测试这些过程。

我认为我能够轻松做到的是将所选文档导出为JSON,然后相对简单地将它们导入到生产数据库中。因此,该系统将有一个很大的"出口"将获取当前文档和所有子文档及相关文档的按钮,并将它们导出为单个JSON文件。然后,我的"导入"按钮将解析生产服务器上的JSON文件。

所以,出口没问题。在几个小时内做到了。

但是,我很快发现,当我导入文档时,不会保留其_id字段值。这显然打破了关系。

我考虑过编写解析例程,通过在保存子文档后以编程方式在父文档中设置ObjectIds来保留这些关系。这将是一个令人头痛的问题。

我希望有: a)...以及简单的方法导入一个完整的_id字段的JSON文档,或者...... b)......完全实现这一目标的另一种方式比我制作它更容易。

我感谢任何建议。

2 个答案:

答案 0 :(得分:0)

总有一个人不知道答案谁会抱怨这个问题。问题很清楚,问题很熟悉。

实际上,当您通过create()方法或使用构造函数(var thing = new Thing())创建文档时,Mongoose将覆盖您为_id提供的任何值。

另外,mongoexport / mongoimport不会满足于以编程方式执行此操作的需要,至少不容易。

如果我理解正确,您希望导出文档的子集以及任何相关文档,保持参考不变。然后,您希望将此数据导入远程系统,同样保持参考不变。

你采取的方法可以正常工作,除非它会破坏所有引用,正如你所发现的那样。

我已经解决过类似的问题,我相信这样做的最好方法就是做你想要避免的事情。也就是说,你将迭代你的集合,让Mongo生成它的_ids。首先添加子文档,然后在父文档中正确设置引用。我真的不认为还有一种更好的方法可以让你进行精细控制。

答案 1 :(得分:0)

在当前版本的mongodb中,您可以使用db.copyDatabase()。启动要复制数据库的mongodb的当前实例并运行以下命令:

@WebMethod public BeanResponse generar( @WebParam(header=true, mode=Mode.INOUT, name="auditoria", partName="auditoria") Holder<Param> auditoria, @WebParam(name = "res1", targetNamespace = "http://your_namespace.com/", header = true, mode = Mode.OUT, partName = "res1") Holder<String> res1, @WebParam(name = "res2", targetNamespace = "http://your_namespace.com/", header = true, mode = Mode.OUT, partName = "res2") Holder<String> res2, @WebParam(name = "res3", targetNamespace = "http://your_namespace.com/", header = true, mode = Mode.OUT, partName = "res3") Holder<String> res3, @WebParam(name="request") BeanRequest request) throws Exception { //code }

有关更多选项和详细信息,请参阅db.copyDatabase()