【发布时间】:2016-04-19 13:11:05
【问题描述】:
我有一个带有唯一索引的文档 A 和另一个嵌入 A 的文档 B。当我尝试保留 2 个文档 B 中包含相同的文档 A 时,我得到一个 dup key 错误。为什么?难道不应该仅在指定的集合中确保唯一索引吗?
A.java
@Document(collection = "docsA")
public class A {
@Id
private String id;
@Indexed(unique = true)
private String name;
private B embed;
}
B.java
@Document(collection="docsB")
public class B {
@Id
private String id;
@Indexed(unique = true)
private String name;
}
持久化操作:
B b = new B();
b.setName("BName1");
docsBRepository.save(b);
A a1 = new A();
a1.setName("AName1");
a1.setB(b);
docsARepository.save(a1); // stored
A a2 = new A();
a2.setName("AName2");
a2.setB(b);
docsARepository.save(a2); // dup key error
【问题讨论】:
-
但它已在集合中实现。 “嵌入”文档是源集合的“一部分”,实际上并未存储在另一个集合中。因此,当数据嵌入到数组中时,拥有“唯一”属性几乎没有任何意义,除非你真的是认真的。因此,您要么困惑地认为数据存储在其他地方,要么您想要“每个文档的数组中的唯一项”,为此还有其他不涉及索引的编程解决方案。唯一索引始终适用于“集合范围”。
-
我忘了提到每个文档都存储在自己的集合中(我刚刚编辑了帖子)。这就是为什么我需要每个文档中的唯一索引。同时我需要将 doc B 嵌入到 doc A 中,但不确保它的唯一索引。
标签: java spring mongodb unique-constraint