1

我正在将响应式 mongoDB 与 Micronaut 应用程序一起使用

implementation("io.micronaut.mongodb:micronaut-mongo-reactive")

尝试创建 TextIndex 和搜索自由文本功能

public class Product {
    @BsonProperty("id")
    private ObjectId id;
    private String name;
    private float price;
    private String description;
}

在 spring data 中,我们必须@TextIndexed(weight = 2)为集合创建一个 TextIndex,这在 Micronaut 应用程序中是等价的。

4

1 回答 1

1

恐怕 Micronaut Data 还不支持 MongoDB 基于注解的自动索引创建。Micronaut Data 现在简化了仅使用 SQL 数据库的工作。

但是您仍然可以像这样手动创建索引MongoClient

@Singleton
public class ProductRepository {

    private final MongoClient mongoClient;

    public ProductRepository(MongoClient mongoClient) {
        this.mongoClient = mongoClient;
    }

    public MongoCollection<Product> getCollection() {
        return mongoClient
            .getDatabase("some-database")
            .getCollection("product", Product.class);
    }

    @PostConstruct
    public void createIndex() {
        final var weights = new BasicDBObject("name", 10)
            .append("description", 5);

        getCollection()
            .createIndex(
                Indexes.compoundIndex(
                    Indexes.text("name"),
                    Indexes.text("description")
                ),
                new IndexOptions().weights(weights)
            )
            .subscribe(new DefaultSubscriber<>() {
                @Override
                public void onNext(String s) {
                    System.out.format("Index %s was created.%n", s);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    System.out.println("Completed");
                }
            });
    }

}

您当然可以使用任何您想要的订阅者。该匿名类扩展DefaultSubscriber在这里仅用于演示目的。

更新:您可以在启动时创建索引,例如使用@PostConstruct. 这意味着将所有索引创建逻辑添加到@PostConstruct某个存储库或由注释的服务类中注释的方法中@Singleton,然后将在存储库/服务单例创建后调用。

于 2020-11-01T10:28:49.237 回答