如何在mongo中加入DBRef对象

时间:2016-12-12 09:53:07

标签: java spring mongodb

嗨,我正在收集我的第一个收藏品

    students 
{
 "name" : "abc"
 "class" : "1"
 "subjects" : DBRef("subjects","class1")
}

和我的第二个集合

 subjects
{
 "_id" : "class1"
 "sub1" : "english"
 "sub2" : "physics"
}

我希望在加入上述两个系列

之后实现我的输出
   {
 "name" : "abc"
 "class" : "1"
 "subjects" : {sub1 : "english",sub2 : "physics"}
}

是否有可能,如果是的话?

2 个答案:

答案 0 :(得分:5)

您可以使用@DBRef来引用Subjects中的Student文档。

  

映射框架不必存储嵌入的子对象   在文件中。您也可以单独存储它们并使用   DBRef引用该文档。从中加载对象时   MongoDB,这些引用将得到热切的解决,你会得到   返回一个映射对象,该对象看起来与存储的对象相同   嵌入主文档中。

     

这是使用DBRef引用特定文档的示例   它独立于引用它的对象而存在   (为了简洁起见,这两个课程都是在线显示的):

Refer this link

Another SO link

修改: -

实际上,为了向您提供更多详细信息,@DBRef注释会急切地加载数据(即本例中的主题)。

学生模特课: -

@Document(collection = "students")
public class Students implements Serializable, BaseDocument {

    private static final long serialVersionUID = -3534650012619938612L;

    @Id
    private String id;

    @Field("class")
    private String className;

    @DBRef
    @Field("subjects")
    private Subject subject;

    public String getId() {
        return id;
    }

    public String getClassName() {
        return className;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setClassName(String className) {
        this.className = className;
    }

    public Subject getSubject() {
        return subject;
    }

    public void setSubject(Subject subject) {
        this.subject = subject;
    }

    @Override
    public String toString() {
        return "Students [id=" + id + ", className=" + className + ", subject=" + subject + "]";
    }
}

主题模型类: -

@Document(collection = "subjects")
public class Subject implements Serializable, BaseDocument {

    private static final long serialVersionUID = -3534650012619938612L;

    @Id
    private String id;

    private String sub1;
    private String sub2;

    public String getId() {
        return id;
    }

    public String getSub1() {
        return sub1;
    }

    public String getSub2() {
        return sub2;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setSub1(String sub1) {
        this.sub1 = sub1;
    }

    public void setSub2(String sub2) {
        this.sub2 = sub2;
    }

    @Override
    public String toString() {
        return "Subject [id=" + id + ", sub1=" + sub1 + ", sub2=" + sub2 + "]";
    }

}

按ID获取学生: -

当您通过Id获得学生时,框架/ mongodb将自动加载主题数据。您不需要专门联系以获取主题数据。

public Students getStudents(String id) {

        MongoOperations mongoOperations = getMongoConnection();

        Students students = mongoOperations.findById(id, Students.class);

        System.out.println(students.toString());

        return students;

    }

<强>输出: -

Students [id=584ea66e9e53b7802651de36, className=1, subject=Subject [id=class1, sub1=english, sub2=physics]]

主题收集: -

{
    "_id" : "class1",
    "sub1" : "english",
    "sub2" : "physics"
}

学生收藏: -

{
    "_id" : ObjectId("584ea66e9e53b7802651de36"),
    "name" : "abc",
    "class" : "1",
    "subjects" : {
        "$ref" : "subjects",
        "$id" : "class1",
        "$db" : "localhost"
    }
}

答案 1 :(得分:0)

您可以像这样制作学生藏品:

    students 
{
 "name" : "abc"
 "class" : "1"
 "subjects" : [{ type: Schema.Types.ObjectId}] // You will store Objectids of subject
}

现在,当您在学生上找到查询时,请填充数据。