Springboot MongoDb,具有两个值作为复合唯一值的集合

问题描述 投票:0回答:1

我正在使用 MongoDb 运行 Springboot3,我不知道如何设置一个具有两个字段的集合,这两个字段在组合中必须是唯一的。

如果没有在集合上设置唯一复合索引,则没有效果。 我本以为在 Java 实体上声明它就足够了。

一些代码:

@Document("Asset")
@CompoundIndexes({
    @CompoundIndex(def = "{'userId': 1, 'name': 1}", unique = true)
})
public class Asset {

    @Id
    private String id;
    private String userId;
    private String name;
    ...

字段

userId
name
在集合中必须是唯一的。 那没有任何效果。我的 MongoConfiguration 上确实有一个
@EnableMongoRepositories

@Configuration
@EnableMongoRepositories
@Slf4j
public class MongoConfiguration {

    private final String mongoDatabaseName = "testNoSql";
    private final String mongoDatabaseAddress = "localhost:27017";

另一方面,我正在使用

MongoDb Compass
来查看数据库部分发生了什么。
在集合中
Asset
我希望声明一个额外的索引,但事实并非如此。我手动创建一个:

效果是它不像复合键,而是像简单的字段唯一键。带有

userId
的条目只能存在一次,无论
name
设置为什么。

MongoDBCompass collection index settings

到目前为止,通过阅读文档和提示,我预计

@EnableMongoRepositories
将提供在数据库端自动构建复合键(就像 @Id 所做的那样)。
我见过的所有示例似乎都是开箱即用的,但对我来说,它们似乎隐藏了一些设置。

有人可以启发我吗?预先感谢您。

mongodb spring-boot spring-data-mongodb compound-index
1个回答
0
投票

您可以为

id
userId
创建另一个类。将该类作为对象添加到您的
Asset
类中,并为该对象添加注释
@id

参考:https://www.baeldung.com/spring-data-mongodb-composite-key

© www.soinside.com 2019 - 2024. All rights reserved.