简体   繁体   English

MongoDB Spring Data-将文档ID应用于子对象ID字段

[英]MongoDB Spring Data - apply document id to child objects id fileds

Please look at the following Mongo DB document: 请查看以下Mongo DB文档:

@Document(collection = CitizenForumMessageDocument.COLLECTION_NAME)
public class ImageDocument {

    public static final String COLLECTION_NAME = "images";

    @Id
    private String      id;   // autogenerated 
    private Image       data; // data for the client (web, mobile...)
    private ImageMeta   meta; // for internal application work (uploader ip, etc...)

    [...] // getter, setter

}

// send as is to a client
public class Image {

    private String id;

    [...]
}

Is it possible to apply the document id to the Image id while document creation. 创建文档时是否可以将文档ID应用于Image ID。

How I'm doing it now: 我现在的做法:

public void saveUploadedImage(Client client, ImageForm form) {

    ImageDocument doc = new ImageDocument();

    dao.save(doc); // create document cause we need an id...

    try {
        doc.setImage(createImage(form, doc.getId()));
        doc.setMeta(createMeta(client, form));
    } catch(Exception e){
        dao.remove(doc);
        return; // ugly...
    }

    dao.update(doc);
}

I could also do it by using some reflection hacks in my dao layer, but I hope there is a better solution for this issue. 我也可以通过在dao层中使用一些反射技巧来做到这一点,但我希望对此问题有更好的解决方案。

You can use Mongo Lifycycle Events for this. 您可以为此使用Mongo Lifycycle Events

@Component
public class MongoListener extends AbstractMongoEventListener<ImageDocument>
{

  private final MongoTemplate mongoTemplate;

  @Autowired
  public MongoListener(final MongoTemplate mongoTemplate) {
    this.mongoTemplate = mongoTemplate;
  }

  @Override
  public void onAfterSave(AfterSaveEvent<ImageDocument> event) {

    ImageDocument imageDocument = event.getSource();
    if(imageDocument.getData().getId() == null) {
      imageDocument.getData().setId(imageDocument.getId());
      mongoTemplate.save(imageDocument);
    }
  }
}

I have to tell, that this is quite ugly, because for every save there will be two database calls. 我不得不说,这很丑陋,因为每次保存都会有两个数据库调用。

But I don't see any other way to do this. 但是我没有其他方法可以做到这一点。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM