让我们说我有一个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);
}
感谢您的帮助!
罗伊
答案 0 :(得分:0)
你真的想要吗?
对象ID由mongodb生成,其中包含一些其他信息:
ObjectId是一个12字节的BSON类型,使用:
构造
- 4字节值,表示自Unix纪元以来的秒数,
- 3字节机器标识符,
- 2字节进程ID,
- 3字节计数器,以随机值开头。
醇>
没有必要在你身边产生这一点。但仍然可以覆盖该功能。
来自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;
}
我希望现在能够明白。
答案 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。到目前为止没有运气。