我真的是noSql和mongoDb的新手,我手中有很多问题,
搜索之后,我在Morphia的文档中找到了Morphia,它是Java的ODM框架,我们可以看到一些注释,例如@Indexed,这些注释会导致为该特定列创建索引。
但是文件对我来说令人困惑的问题是“ datastore.ensureIndexes()”


  如果您使用@Indexedannotation,则应在应用程序启动后注册实体后调用datastore.ensureIndexes()。


因此,在阅读该句子之后,我可以在脑海中看到我的问题:“我们应该每次重新定义所有索引吗?
我希望我们可以在像mongeez(mongeez与liquibase相似)之类的地方定义一次索引,使其完全运行一次。

最佳答案

因此,您所指的是文档here,然后可能需要对它的含义以及该文档中提供的观点进行一些澄清。

因此,正如该文件所说,按照您的报价,是您为“ Entity”类提供的索引定义是由数据存储区上的.ensureIndex()方法提取的,“当调用该索引是为了执行并“创建”所有这些索引。

文档的第二点定义了“作为示例”以及类映射定义,如下所示:

Morphia m = ...
Datastore ds = ...

m.map(Product.class);
ds.ensureIndexes(); //creates all defined with @Indexed


确实,每次启动应用程序时都会调用该方法,有些人考虑采用这种最佳做法来确保所有定义都保持“最新”。但也请注意,这只是一个意见。

正如您似乎要指出的那样,如果您只具有一些“部署后”钩子,那么在您实际“部署”应用程序时,或者实际上是“根据需要”在您确定重新部署应用程序时可以调用该钩子,可能是更好的做法。定义索引实际上是必需的。

我通常同意的一种技术是为您的应用程序公开诸如“可调用” API之类的方法,以便在部署后,您可以在其中“编写”方法以调用该API函数并实际上重新定义所有索引(或什至子集)的决定。

因此,实际的解释是,使用Morphia实际上并不意味着每次“自动”启动应用程序时都会重新定义索引,但是如果您确实将对.enssureIndexes()方法的调用放在每次应用程序启动,那么它将启动。

不要在与类映射相同的地方调用它。将其放在您可以控制此位置的其他位置,即可解决问题。

10-07 18:58
查看更多