在我的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
,但我相信有更好的方法。
答案 0 :(得分:0)
据我所知,没有办法“禁用”嵌套文档的唯一性。 正如 question mongo索引中所回答的,其主要目的是加快某些查询的速度,而减少数据验证的速度。
如果您仍然希望保持唯一性,那么我可以考虑采用mongo的unique compound index and missing values 。 为电子邮件创建唯一的复合索引+为用户创建一个空字段。 同时插入一个将用户null字段设为唯一的提交集(时间哈希或唯一的提交ID) 从而创建不会冲突的唯一复合索引。