使用mongoTemplate将String字段序列化为objectId字段

时间:2014-07-13 07:06:04

标签: mongodb spring-data mongotemplate

让我们说我有一个pojo

public class example{
    private String id;
    private String photoId
}

现在保存此pojo的实例时,id将保存为objectId。我还想将photoId序列化为ObjectId。是否有某种注释我可以添加到photoId 这会启用吗?

public class example{
    @Id
    private String id; //default objectId serialization

    @MongoType(ObjectId.class) //not real annotation, looking for real one
    private String photoId; // enforce ObjectId serialization - what i want

mongoTemplate.insert(examplePojo); //will result as {_id :objectId(), photoId: objectId(...)}

-----编辑------ photoId是objectId的字符串rep,例如:

public void saveExample(String id, String photoId){
    Example example = new Example(id, photoId);
    mongoTemplate.insert(example);
}

感谢您的帮助!

罗伊

3 个答案:

答案 0 :(得分:0)

你真的想要吗?

对象ID由mongodb生成,其中包含一些其他信息:

  

ObjectId是一个12字节的BSON类型,使用:

构造      
      
  1. 4字节值,表示自Unix纪元以来的秒数,
  2.   
  3. 3字节机器标识符,
  4.   
  5. 2字节进程ID,
  6.   
  7. 3字节计数器,以随机值开头。
  8.   

没有必要在你身边产生这一点。但仍然可以覆盖该功能。

来自spring-mongodb文档:

  

以下概述了将要进行的类型转换(如果有)   使用时映射到_id文档字段的属性   MappingMongoConverter,MongoTemplate的默认值。

     
      
  • 如果可能,使用Spring语言将Java类中声明为 String 的id属性或字段转换为ObjectId并存储为ObjectId   转换器。有效转换规则委托给
      MongoDB Java驱动程序。如果它无法转换为ObjectId,则   然后该值将作为字符串存储在数据库中。
  •   
  • Java类中声明为 BigInteger 的id属性或字段将使用Spring转换为ObjectId并存储为   转换器。
  •   

但是,您可以为自己的类型编写自己的Converter。

同时更改

@MongoType(ObjectId.class)@Id。并确保您的自定义ID具有某些值,如果不是,mongodb将为您创建ObjectID。

还检查有关ObjectIds的mongodb manual

<强>更新

现在的问题是如何处理参考文献。

这是手册中的一个小例子。

@Document
public class Account {
 @Id
 private ObjectId id;
 private Float total;
}
@Document
public class Person {
 @Id
 private ObjectId id;
 @Indexed
 private Integer ssn;
 @DBRef
 private List<Account> accounts;
}

我希望现在能够明白。

spring-mongodb documentation第4.6节

答案 1 :(得分:0)

我能找到的唯一解决方案是在MongoDB中将photoId的类型设置为String。如果您尝试将objectId值分配给mongo shell中的字段,请先将objectId转换为字符串:

<?php

namespace Acme\UserBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;

class ProfileFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('couple', IntegerType::class, array(
            'label' => 'Couple ID',
            'property_path' => 'couple.id',
            'attr' => array('min' => 0),
        ));
    }

    public function getBlockPrefix()
    {
        return 'acme_user_profile';
    }
}

答案 2 :(得分:0)

我们找到了一种使用org.bson.types.ObjectId类以Java代码以编程方式生成ObjectId的解决方案:

String newId = ObjectId.get().toString();

// Our order entity in payment system needs a different id for external usage, for security reasons.
order.setExternalOrderId(newId);

但是仍然想知道是否可以使用MongoDB为我们自动生成ObjectId。到目前为止没有运气。