Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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_Mongodb Query_Morphia_Nosql - Fatal编程技术网

Java 每次都应该重新定义Mongodb索引

Java 每次都应该重新定义Mongodb索引,java,mongodb,mongodb-query,morphia,nosql,Java,Mongodb,Mongodb Query,Morphia,Nosql,我对noSql和mongoDb非常陌生,很多问题都在我手上, 在搜索之后,我找到了Morphia,一个用于java的ODM框架,在Morphia的文档中,我们可以看到一些注释,比如@index,它们导致为特定列创建索引。 但对我来说,令人困惑的问题是“datastore.ensureIndexes()”,文档中说 若您使用@Indexedannotation,则应在应用程序启动后注册实体后调用datastore.ensureIndex() 所以在读了那句话之后,我可以在脑海中看到我的问题,“我们

我对noSql和mongoDb非常陌生,很多问题都在我手上, 在搜索之后,我找到了Morphia,一个用于java的ODM框架,在Morphia的文档中,我们可以看到一些注释,比如@index,它们导致为特定列创建索引。 但对我来说,令人困惑的问题是“datastore.ensureIndexes()”,文档中说

若您使用@Indexedannotation,则应在应用程序启动后注册实体后调用datastore.ensureIndex()

所以在读了那句话之后,我可以在脑海中看到我的问题,“我们应该每次都重新定义所有的索引?
我希望我们可以在像Mongez(Mongez类似于liquibase)这样的地方定义索引一次,然后运行一次。

所以您所指的是文档,然后可能会稍微澄清一下这意味着什么以及文档中提供的意见

因此,正如文档所说,根据您的引用,您为“实体”类提供的索引定义是由数据存储上的
.ensureIndex()
方法提取的,“当调用该方法时,以便继续并“重新创建”所有这些索引

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

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

m.map(Product.class);
ds.ensureIndexes(); //creates all defined with @Indexed 
并且实际上,每次启动应用程序时都会调用<强>遗嘱< /强>,有些人认为这是最好的做法,以确保所有的定义都是“最新的”。但也要注意,这只是一种观点

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

我通常同意的一种技术是,为应用程序公开一个方法作为“可调用”API,这样在部署时,您就可以在那里“编写脚本”方法来调用该API函数,并根据您的决定重新定义所有索引(甚至子集)

因此,实际的解释是,使用Morphia并不意味着每次应用程序“自动”启动时都会重新定义索引,但如果您确实将调用放在每次启动应用程序时都会调用的
.ensureIndexes()
方法的某个位置,然后它将这样做


不要在与类映射相同的位置调用它。把它放在你可以控制的地方,问题就解决了。

所以你指的是文档,然后可能会对文档中所提供的意见进行一点澄清

因此,正如文档所说,根据您的引用,您为“实体”类提供的索引定义是由数据存储上的
.ensureIndex()
方法提取的,“当调用该方法时,以便继续并“重新创建”所有这些索引

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

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

m.map(Product.class);
ds.ensureIndexes(); //creates all defined with @Indexed 
并且实际上,每次启动应用程序时都会调用<强>遗嘱< /强>,有些人认为这是最好的做法,以确保所有的定义都是“最新的”,但也请注意,这只是一个意见。 正如您所指出的,如果您只是有一些“部署后”钩子,在您实际“部署”应用程序时,或者在您确定确实需要重新定义索引时,“根据需要”,可以调用这些钩子,这可能是更好的做法

我通常同意的一种技术是,为应用程序公开一个方法作为“可调用”API,这样在部署时,您就可以在那里“编写脚本”方法来调用该API函数,并根据您的决定重新定义所有索引(甚至子集)

因此,实际的解释是,使用Morphia并不意味着每次应用程序“自动”启动时都会重新定义索引,但如果您确实调用了该
.ensureIndexes()
方法,每次启动应用程序时都会调用它,然后它将执行此操作

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

如果索引已经就位,调用EnsureIndex()实际上是免费的。您可以(也可以说应该这样做)将此调用直接放在映射调用之后,不会产生任何实际影响。将创建任何新索引,但现有索引基本上不会有任何操作

值得一提的是,可以找到morphia文档。

如果索引已经存在,则调用EnsureIndex()实际上是免费的。您可以(也可以说应该)将此调用直接放在映射调用之后,而不会产生任何实实在在的影响。可以创建任何新的索引,但现有的索引基本上没有操作


什么值得,吗啡文档可以找到。

你在看官方回购吗?你在看官方回购吗?我只是想我们可以考虑用Mangez索引?我只是想我们可以考虑用Mangez索引?