3

假设我有一个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(...)}

----- EDIT ------ photoId 是 objectId 的字符串代表,例如:

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

谢谢你的帮助!

罗伊

4

3 回答 3

0

你真的想要那个吗?

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

ObjectId 是一个 12 字节的 BSON 类型,使用以下方法构造:

  1. 表示自 Unix 纪元以来的秒数的 4 字节值,
  2. 3 字节机器标识符,
  3. 2 字节进程 ID,以及
  4. 3 字节计数器,以随机值开始。

无需在您这边生成。但是仍然可以覆盖该功能。

从 spring-mongodb 文档中:

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

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

但是,您可以为自己的类型编写自己的转换器。

也改变

@MongoType(ObjectId.class)@Id. 并确保您的自定义 id 具有一定的价值,如果没有,mongodb 将为您创建一个 ObjectID。

另请查看有关 ObjectIds的 mongodb手册。

更新

现在的问题是如何处理引用。

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

@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 文档第 4.6 节

于 2014-07-13T08:52:08.263 回答
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。到目前为止还没有运气。

于 2018-09-03T03:15:02.810 回答
0

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

var photoId = db.photo.insertOne({name : "xyz.png"}).insertedId
db.example.insertOne({
    photoId : photoId.str //<-- Changed objectId to string
})
于 2017-12-21T14:39:12.007 回答