使用spring data mongo MongoTemplate 插入数据时 手动指定集合名称时,索引不会自动创建?

使用 MongoTemplate 插入数据时 手动指定集合名称时,索引不会自动创建

public void save(DatapointData data) {
        mongoTemplate.insert(data, data.getPid());
    }
public <T> Collection<T> insert(Collection<? extends T> batchToSave, String collectionName) {
        Assert.notNull(batchToSave, "BatchToSave must not be null!");
        Assert.notNull(collectionName, "CollectionName must not be null!");
        return this.doInsertBatch(collectionName, batchToSave, this.mongoConverter);
    }
package com.chico.client.iot.entity;

import java.io.Serializable;

import lombok.Data;
import org.springframework.data.mongodb.core.index.IndexDirection;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

/**
 * 数据点数据上报表
 *
 */
@Data
@Document(collection = "datapoint_data")
public class DatapointData implements Serializable {
    private static final long serialVersionUID = 1765700798800606339L;

    /**
     * 设备id
     */
    @Indexed
    private String devId;

    /**
     * 产品id
     */
    private String pid;

    /**
     * 功能点的code
     */
    @Indexed
    private String identifier;

    /**
     * 功能点的值
     */
    private String value;

    /**
     * 时间
     */
    @Indexed(direction = IndexDirection.DESCENDING)
    private Long time;

}

@Document(collection = "datapoint_data") 注解中这个集合能够正常创建。
但是mongodb中存的是物联网数据,集合名是使用的pid,方便管理
有没有方法能让mongodb 自动创建索引

补充:如下方法是能创建索引的,但是不太想用这种方式

mongoTemplate.indexOps(pid).ensureIndex(new Index().on("time", Sort.Direction.DESC));
阅读 1.2k
1 个回答

插入数据之前或者之后:

public void save(DatapointData data) {
    String collectionName = data.getPid();

    // 保证集合的索引存在
    ensureIndexes(DatapointData.class, collectionName);

    // 插入数据
    mongoTemplate.insert(data, collectionName);
}

public <T> void ensureIndexes(Class<T> entityClass, String collectionName) {
    IndexOperations indexOps = mongoTemplate.indexOps(collectionName);
    indexOps.ensureIndexes(entityClass);
}

建一个MongoIndexCreator类:

import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.index.IndexOperations;
import org.springframework.stereotype.Component;

@Component
public class MongoIndexCreator {

    private final MongoTemplate mongoTemplate;

    public MongoIndexCreator(MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    public void createIndexes() {
        // 创建DatapointData集合的索引
        IndexOperations indexOps = mongoTemplate.indexOps(DatapointData.class);
        indexOps.ensureIndexes();
    }
}

Spring Boot应用程序启动时候调这个方法:

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class IndexInitializerRunner implements CommandLineRunner {

    private final MongoIndexCreator mongoIndexCreator;

    public IndexInitializerRunner(MongoIndexCreator mongoIndexCreator) {
        this.mongoIndexCreator = mongoIndexCreator;
    }

    @Override
    public void run(String... args) throws Exception {
        mongoIndexCreator.createIndexes();
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题