我是noSql和mongoDb的新手,手里还有很多问题, 在搜索之后,我在Morphia的文档中找到了Morphia,一个用于java的ODM框架,我们可以看到一些注释,比如@Indexed导致为该特定列创建索引。 但令我困惑的问题是“datastore.ensureIndexes()”,文档说
如果你正在使用@Indexedannotation,你应该在应用程序启动后注册实体后调用datastore.ensureIndexes()。
所以我在读完那句话后可以在脑海中看到我的问题,“我们应该每次重新定义所有索引吗? 我希望我们可以在mongeez(mongeez类似于liquibase)之类的地方定义索引来运行一次。
答案 0 :(得分:3)
如果索引已经到位,则调用ensureIndexes()几乎是免费的。您可以(并且可以说应该)在您的映射调用之后直接调用此调用,而不会产生任何实际影响。将创建任何新索引,但现有索引基本上是无操作。
为了它的价值,可以找到morphia文档here。
答案 1 :(得分:2)
所以你所指的是文档here,然后可能稍微澄清一下这意味着什么以及该文档中提供的意见。
正如文档所说,根据您的引用,您为“实体”类提供的索引定义是由数据存储区上的 .ensureIndex()
方法选取的,< em>“当它被称为时,为了去”重新创建“所有这些索引。
文档中的第二点将此“作为示例”定义为类映射定义,如下所示:
Morphia m = ...
Datastore ds = ...
m.map(Product.class);
ds.ensureIndexes(); //creates all defined with @Indexed
确实,每次启动应用程序时都会调用 ,有些人会考虑这种最佳做法,以确保所有定义都是“最新的”。但请注意,这只是一种意见。
正如您似乎指出的那样,如果您只是在实际“部署”应用程序时可以调用一些“post deploy”钩子,或者确实“根据需要”确定您可能会更好的做法实际上需要重新定义索引。
通常我同意的一种技术是为您的应用程序公开这样一种“可调用”API的方法,以便在部署时,您可以“脚本”方法调用该方法API函数,并在您决定的时候实际重新定义所有索引(甚至是子集)。
所以实际解释是使用Morphia 不实际上意味着每次应用程序“自动”启动时都会重新定义索引,但是如果你确实将调用放在上.enssureIndexes()
方法,每次启动应用程序时都会调用它,然后将执行此操作。
请勿在类映射的同一位置调用它。把它放在可以控制它的其他地方,问题就解决了。