Spring整合MongoDB----对象映射之创建索引

【Spring连载】使用Spring Data访问 MongoDB----对象映射之创建索引


Spring Data MongoDB可以自动为用@Document注解的实体类型创建索引。从3.0版本起,必须显式启用索引创建,以防止对集合生命周期和性能产生不希望的影响。在应用程序启动时以及在应用程序运行时首次访问实体类型时,会自动为初始实体集创建索引。
我们通常建议为基于应用程序的索引控制创建显式索引,因为Spring Data无法自动为在应用程序运行时重新创建的集合创建索引。
如果您想使用@GeoSpatialIndexed、@TextIndexed,@CompoundIndex和@WildcardIndexed等@Indexed注解,IndexResolver为编程式索引定义创建提供了一个抽象。可以将索引定义与IndexOperations一起使用来创建索引。创建索引的一个好时间点是在应用程序启动时,特别是在刷新应用程序上下文之后,通过观察ContextRefreshedEvent来触发。此事件保证上下文已完全初始化。请注意,此时其他组件,尤其是bean工厂,可能可以访问MongoDB数据库。
IndexResolver将跳过类似映射的属性,除非使用@WildcardIndexed进行注解,因为map key必须是索引定义的一部分。由于映射的目的是使用动态key和value,因此无法从静态映射元数据中解析键。
例1:为单个域类型创建编程式索引

class MyListener {

  @EventListener(ContextRefreshedEvent.class)
  public void initIndicesAfterStartup() {

    MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext = mongoTemplate
                .getConverter().getMappingContext();

    IndexResolver resolver = new MongoPersistentEntityIndexResolver(mappingContext);

    IndexOperations indexOps = mongoTemplate.indexOps(DomainType.class);
    resolver.resolveIndexFor(DomainType.class).forEach(indexOps::ensureIndex);
  }
}

例2:为所有初始实体创建编程式索引

class MyListener{

  @EventListener(ContextRefreshedEvent.class)
  public void initIndicesAfterStartup() {

    MappingContext<? extends MongoPersistentEntity<?>, MongoPersistentProperty> mappingContext = mongoTemplate
        .getConverter().getMappingContext();

    // consider only entities that are annotated with @Document
    mappingContext.getPersistentEntities()
                            .stream()
                            .filter(it -> it.isAnnotationPresent(Document.class))
                            .forEach(it -> {

    IndexOperations indexOps = mongoTemplate.indexOps(it.getType());
    resolver.resolveIndexFor(it.getType()).forEach(indexOps::ensureIndex);
    });
  }
}

或者,如果你想在任何组件能够从应用程序访问数据库之前确保索引和集合的存在,请为MongoTemplate声明一个@Bean方法,并在返回MongoTemplate对象之前包含上面的代码。
若要打开自动索引创建,请覆盖配置中的autoIndexCreation()。

@Configuration
public class Config extends AbstractMongoClientConfiguration {

  @Override
  public boolean autoIndexCreation() {
    return true;
  }

// ...
}

自3.0版本起,自动索引创建默认关闭。

一、复合索引

框架还支持复合索引。它们是在类级别上定义的,而不是在单个属性上定义的。
复合索引对于提高涉及多个字段上的条件的查询的性能非常重要。
以下是一个创建lastName(升序)和age(降序)复合索引的示例:
例3:复合索引用法示例

package com.mycompany.domain;

@Document
@CompoundIndex(name = "age_idx", def = "{'lastName': 1, 'age': -1}")
public class Person {

  @Id
  private ObjectId id;
  private Integer age;
  private String firstName;
  private String lastName;

}

使用@CompoundIndexes作为容器,@CompoundIndex是可重复的。

@Document
@CompoundIndex(name = "cmp-idx-one", def = "{'firstname': 1, 'lastname': -1}")
@CompoundIndex(name = "cmp-idx-two", def = "{'address.city': -1, 'address.street': 1}")
public class Person {

  String firstname;
  String lastname;

  Address address;

  // ...
}

二、哈希索引

哈希索引允许在分片集群中进行基于哈希的分片。使用哈希字段值来分割集合会导致更随机的分布。有关详细信息,请参阅MongoDB文档
下面是一个为_id创建哈希索引的示例:
例4:哈希索引用法示例

@Document
public class DomainType {

  @HashIndexed @Id String id;

  // ...
}

哈希索引可以与其他索引一起创建,如下所示,在这种情况下,会创建两个索引:
例5:哈希索引与简单索引一起使用示例

@Document
public class DomainType {

  @Indexed
  @HashIndexed
  String value;

  // ...
}

如果上面的示例过于冗长,则复合注解可以减少需要在属性上声明的注解数量:
例6:组合哈希索引用法示例

@Document
public class DomainType {

  @IndexAndHash(name = "idx...")                           --------1 
  String value;

  // ...
}

@Indexed
@HashIndexed
@Retention(RetentionPolicy.RUNTIME)
public @interface IndexAndHash {

  @AliasFor(annotation = Indexed.class, attribute = "name") --------1
  String name() default "";
}

1. 可能会为元注解的某些属性注册别名。

尽管通过注解创建索引在许多情况下都很方便,但可以通过IndexOperations手动设置索引来接管更多的控制权。

mongoOperations.indexOpsFor(Jedi.class)
  .ensureIndex(HashedIndex.hashed("useTheForce"));

三、通配符索引

通配符索引是一种索引,可用于包括所有字段或基于给定(通配符)模式(pattern)的特定字段。有关详细信息,请参阅MongoDB文档
可以通过IndexOperations使用WildcardIndex以编程方式设置索引。
例7:编程式通配符索引设置

mongoOperations
    .indexOps(User.class)
    .ensureIndex(new WildcardIndex("userMetadata"));
db.user.createIndex({ "userMetadata.$**" : 1 }, {})

@WildcardIndex注解允许声明性索引设置,该设置可以与document类型或属性一起使用。
如果放置在根级域实体的类型(用@Document注解的类型)上,索引解析程序将为其创建通配符索引。
例8:域类型的通配符索引

@Document
@WildcardIndexed
public class Product {
	// …
}
db.product.createIndex({ "$**" : 1 },{})

wildcardProjection可用于指定索引中的in-/exclude键。
例9:带通配符投影的通配符索引

@Document
@WildcardIndexed(wildcardProjection = "{ 'userMetadata.age' : 0 }")
public class User {
    private @Id String id;
    private UserMetadata userMetadata;
}
db.user.createIndex(
  { "$**" : 1 },
  { "wildcardProjection" :
    { "userMetadata.age" : 0 }
  }
)

通配符索引也可以通过将注解直接添加到字段来表示。请注意,在嵌套路径(如属性)上不允许使用通配符投影。在创建索引的过程中,会省略对使用@WildcardIndexed注解的类型的投影。
例10:属性的通配符索引

@Document
public class User {
    private @Id String id;

    @WildcardIndexed
    private UserMetadata userMetadata;
}
db.user.createIndex({ "userMetadata.$**" : 1 }, {})

四、文本索引

MongoDB v.2.4默认禁用文本索引功能。

创建文本索引可以将多个字段累积到可搜索的全文索引中。每个集合只能有一个文本索引,因此所有用@TextIndexed标记的字段都会合并到此索引中。可以对属性进行加权,以影响排名结果的文档分数。文本索引的默认语言是英语。要更改默认语言,请将语言属性设置为所需的任何语言(例如,@Document(language=“spanish”))。使用名为language的属性或@Language,可以在每个document的基础上定义语言覆盖。以下示例显示如何创建文本索引并将语言设置为西班牙语:
例11:文本索引用法示例

@Document(language = "spanish")
class SomeEntity {

    @TextIndexed String foo;

    @Language String lang;

    Nested nested;
}

class Nested {

    @TextIndexed(weight=5) String bar;
    String roo;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.了解Spring 2.了解NoSQL和文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值