MongoDB/Morphia 内引用
Reference within MongoDB/Morphia
我发现这个 post 讨论了是否应该建立文档之间的引用。我想注释我的 Java
class 以便创建 JSON
文档中的引用:
{
"id": "3",
"bs": [
{
"name": "abc"
},
{
"name": "def",
"preconditions": ["abc"]
},
{
"name": "ghi",
"preconditions": ["abc"]
}
]
}
这里先决条件列表的对象引用了bs列表的对象。这在 MongoDB
中可能吗?它是如何命名的(我无法使用关键字 "embedded reference" 和 "reference within documents" 找到任何信息。)使用 morphia 的解决方案会是什么样子?
编辑:我知道 reference 注释,但它似乎引用了另一个集合,而不是同一文档中的对象列表。我只想确保序列化的 java 对象被正确反序列化(两个属性应该成为对同一对象的引用)。
编辑二:为了澄清我的问题,我提供了用于测试的代码:
Class一个
@Entity("MyAs")
public class A {
@Id
public String name;
@Embedded
public List<B> bs=new LinkedList<B>();
}
ClassB
public class B {
@Id
public String bName;
public List<B> preconditions=new LinkedList<B>();
}
在我的主要方法中,我执行以下操作:
final Datastore datastore = morphia.createDatastore(new MongoClient(),
"Test");
B b1=new B();
b1.bName="b1";
B b2=new B();
b2.bName="b2";
b1.preconditions.add(b2);
List<B> bs=new LinkedList<B>();
bs.add(b1);
bs.add(b2);
A a1=new A();
a1.name="mya1";
a1.bs=bs;
datastore.save(a1);
A myA=datastore.get(A.class,"mya1");
System.out.println(myA.bs.get(0).preconditions.get(0));
System.out.println(myA.bs.get(0).preconditions.get(0).hashCode()+" --" +myA.bs.get(0).preconditions.get(0).bName);
System.out.println(myA.bs.get(1));
System.out.println(myA.bs.get(1).hashCode() +" --" + myA.bs.get(1).bName);
这导致 Mongo DB Compass 中的以下结构(显然,没有创建引用):
如果文档被反序列化(使用 datastore.get),显然会为 b2 创建两个单独的对象(System.out.println
的输出):
mongotest.B@78b729e6
2025269734 --b2
mongotest.B@6b4a4e18
1800031768 --b2
我想要一个结构,其中先决条件中的 b2 对象引用 bs 中的 b2 对象!
如果我这样做 datastore.get(A.class,"mya1");
我想拥有与序列化相同的结构:在 bs 列表和先决条件中引用的单个 B 对象..
要创建 那个 结构,您只需在您的实体上有一个 List<B>
并用 @Embedded
注释该字段。有关更多文档,请参阅 here。
我删除了我的 MonogDB 集合并重试 运行 我的示例:现在它似乎可以工作了。前置条件中的b指的是bs数组中的对象。需要嵌入注释!
我发现这个 post 讨论了是否应该建立文档之间的引用。我想注释我的 Java
class 以便创建 JSON
文档中的引用:
{
"id": "3",
"bs": [
{
"name": "abc"
},
{
"name": "def",
"preconditions": ["abc"]
},
{
"name": "ghi",
"preconditions": ["abc"]
}
]
}
这里先决条件列表的对象引用了bs列表的对象。这在 MongoDB
中可能吗?它是如何命名的(我无法使用关键字 "embedded reference" 和 "reference within documents" 找到任何信息。)使用 morphia 的解决方案会是什么样子?
编辑:我知道 reference 注释,但它似乎引用了另一个集合,而不是同一文档中的对象列表。我只想确保序列化的 java 对象被正确反序列化(两个属性应该成为对同一对象的引用)。
编辑二:为了澄清我的问题,我提供了用于测试的代码:
Class一个
@Entity("MyAs")
public class A {
@Id
public String name;
@Embedded
public List<B> bs=new LinkedList<B>();
}
ClassB
public class B {
@Id
public String bName;
public List<B> preconditions=new LinkedList<B>();
}
在我的主要方法中,我执行以下操作:
final Datastore datastore = morphia.createDatastore(new MongoClient(),
"Test");
B b1=new B();
b1.bName="b1";
B b2=new B();
b2.bName="b2";
b1.preconditions.add(b2);
List<B> bs=new LinkedList<B>();
bs.add(b1);
bs.add(b2);
A a1=new A();
a1.name="mya1";
a1.bs=bs;
datastore.save(a1);
A myA=datastore.get(A.class,"mya1");
System.out.println(myA.bs.get(0).preconditions.get(0));
System.out.println(myA.bs.get(0).preconditions.get(0).hashCode()+" --" +myA.bs.get(0).preconditions.get(0).bName);
System.out.println(myA.bs.get(1));
System.out.println(myA.bs.get(1).hashCode() +" --" + myA.bs.get(1).bName);
这导致 Mongo DB Compass 中的以下结构(显然,没有创建引用):
如果文档被反序列化(使用 datastore.get),显然会为 b2 创建两个单独的对象(System.out.println
的输出):
mongotest.B@78b729e6
2025269734 --b2
mongotest.B@6b4a4e18
1800031768 --b2
我想要一个结构,其中先决条件中的 b2 对象引用 bs 中的 b2 对象!
如果我这样做 datastore.get(A.class,"mya1");
我想拥有与序列化相同的结构:在 bs 列表和先决条件中引用的单个 B 对象..
要创建 那个 结构,您只需在您的实体上有一个 List<B>
并用 @Embedded
注释该字段。有关更多文档,请参阅 here。
我删除了我的 MonogDB 集合并重试 运行 我的示例:现在它似乎可以工作了。前置条件中的b指的是bs数组中的对象。需要嵌入注释!