首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手册参考支持

手册参考支持
EN

Stack Overflow用户
提问于 2013-02-18 23:12:50
回答 2查看 683关注 0票数 1

考虑一下这个类:

代码语言:javascript
复制
class Person {
    String name;
    Person father;
    Person mother;
    List<Person> children;
}

有没有办法告诉jongo,fathermotherchildren应该是同一集合中的其他对象的manual references,而不是嵌入的对象?

注意:这不同于DBRefs

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-19 16:21:01

还没。

最简单的方法是手动发出第二个查询。

不过,您可以创建Jackson de/serializer来在解组过程中获取文档。几个月前,我们创建了一个在解组过程中获取DBRef的峰值,下面的代码可以提供帮助:Handle DBRef during (un)marshalling

您可以随意添加feature request

票数 1
EN

Stack Overflow用户

发布于 2013-11-05 21:56:58

我用一种方法来处理它。我不确定它是否完美,但它对我来说是有效的。

假设你有这些类

代码语言:javascript
复制
public class MyObject {

    @Id
    private String id;
    private MyEmbeddedObject embeddedObject;

    public String getId() {
        return this.id;
    }

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

    public MyEmbeddedObject getEmbeddedObject() {
        return this.embeddedObject;
    }

    public void setEmbeddedObject(MyEmbeddedObject embeddedObject) {
        this.embeddedObject = embeddedObject;
    }

}


public class MyEmbeddedObject {

    @Id
    private String id;

    public String getId() {
        return this.id;
    }

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

}

您希望将MyEmbeddedObject存储在集合"embed“中,将对象存储在集合" Object”中,并手动引用"embed“集合ids。例如:

代码语言:javascript
复制
object : { id:1, embeddedObjectId: 99 }
embed : { id : 99 }

可以为MyEmbeddedObject实现自定义序列化程序和反序列化程序

代码语言:javascript
复制
public class MyEmbeddedObjectSerializer extends JsonSerializer<MyEmbeddedObject> {

    @Override
    public void serialize(MyEmbeddedObject value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
        jgen.writeText(value.getId());
    }
}

public class MyEmbeddedObjectDeserializer extends JsonDeserializer<MyEmbeddedObject> {

    @Override
    public MyEmbeddedObject deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        MyEmbeddedObject obj = new MyEmbeddedObject();
        obj.setId(jsonParser.getString());
        return new MyEmbeddedObject();

    }
 }

如果您在Jongo中注册了序列化程序,问题是它将作为MyObject的成员用于MyEmbeddedObject,但当它自身存储在"embed“集合中时,它也将用于MyEmbeddedObject。

为了仅在MyOBject中嵌入MyEmbeddedObject时才应用定制的序列化/反序列化,我使用了Mixin注释。

代码语言:javascript
复制
public interface MyObjectMixIn {

    @JsonSerialize(using=MyEmbeddedObjectSerializer .class)
    public MyEmbeddedObject getEmbeddedObject();

    @JsonDeserialize(using=MyEmbeddedObjectDeserializer.class)
    public void setEmbeddedObject(MyEmbeddedObject embeddedObject);

}

然后定义一个模块

代码语言:javascript
复制
public class MyModule extends SimpleModule {
    @Override
    public void setupModule(SetupContext context) {
        context.setMixInAnnotations(MyObject.class, MyObjectMixIn.class);
    }
}

最后在Jongo中注册模块

代码语言:javascript
复制
Jongo jongo = new Jongo(db, JacksonMapper.Builder().registerModule(new MyModule ()).build());

现在使用它在Mongo中进行存储

  1. 将对象本身存储在集合“embeddedObject”中以获得id
  2. 确保object的embeddedObject成员包含id
  3. 将对象存储在集合" object“中。只有嵌入对象的id将被存储在

中。

和读取数据存储区

  1. 从集合" object“中读取对象。嵌入对象将仅使用其ID
  2. 进行初始化。如果需要,请读取集合“embed”中的embeddedobject。

编辑:为了避免延迟加载和在反序列化时加载完整的对象,来自Jackson的HandlerInstantiator对象对于定制序列化程序和反序列化程序构造机制非常有用。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14939433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档