Spring Data MongoDB在父对象上可传递地应用唯一索引

时间:2019-04-04 18:09:22

标签: spring mongodb spring-data-mongodb

在我的Spring MVC应用程序中,我具有以下Mongo实体:

#include <functional>

template<class Func, class... Args>
void createStdFunc(Func f, Args... args) {
    // Replaced `Func` with `func_type_t<Func>`
    std::function<func_type_t<Func>> internalFunc = f;
}

int foo(int x) { return x; }

struct bar {
    int operator()(int x) { return x; };
};


int main()
{
    // With lambda expression
    createStdFunc([](int x) {return x; }, 5);

    // With function pointer
    createStdFunc(foo, 5);

    // With std::function
    std::function<int(int)> std_func = [](int x) {return x; };
    createStdFunc(std_func, 5);

    // With a functor
    createStdFunc(bar{}, 5);
}

和一个包含“用户”作为字段的提交实体:


@Document(collection = "users")
public class UserMongoEntity {

  @Id
  private String id;

  @NotBlank
  @Email
  @Indexed(unique = true, sparse = true)
  private String email;

  private String firstName;

当我请求插入一个新用户时,如果已经存在具有相同电子邮件的用户,就会收到错误消息。但是,当我与同一用户两次插入提交内容时,由于违反了索引的唯一性而发生异常: @Document(collection = "submissions") public class SubmissionMongoEntity { @Id private String id; private Instant timestamp; @Valid private UserMongoEntity user;

我可以删除duplicate key error collection: user.email dup key,但我相信有更好的方法。

1 个答案:

答案 0 :(得分:0)

据我所知,没有办法“禁用”嵌套文档的唯一性。 正如 question mongo索引中所回答的,其主要目的是加快某些查询的速度,而减少数据验证的速度。

如果您仍然希望保持唯一性,那么我可以考虑采用mongo的unique compound index and missing values 。 为电子邮件创建唯一的复合索引+为用户创建一个空字段。 同时插入一个将用户null字段设为唯一的提交集(时间哈希或唯一的提交ID) 从而创建不会冲突的唯一复合索引。