使用Spring-data mongodb

时间:2017-12-28 16:02:19

标签: java spring mongodb spring-data

在MongoDB文档中,他们建议使用ObjecId进行手动引用。 请参阅https://docs.mongodb.com/manual/reference/database-references/#document-references

original_id = ObjectId()

db.places.insert({
    "_id": original_id,
    "name": "Broadway Center",
    "url": "bc.example.net"
})

db.people.insert({
    "name": "Erin",
    "places_id": original_id,
    "url":  "bc.example.net/Erin"
})

我正在使用 spring-data-mongodb ,而我正在寻找的是 People 类定义如下:

@Document
public class People {

    private String name;
    @Reference // or any Annotation to convert an ObjectId to a String
    private String placesId; 
    private String url;
}

如何拥有" places_id"作为mongoDB中的ObjectId但映射到POJO中的String?

我希望有一个像 @Reference 这样的注释,但似乎没有实现。

我不明白为什么我们在spring-data-mongodb中没有这种注释。对于使用手动引用的所有文档,我不想实现spring documentation中建议的显式转换器。 也许这不是正确的做法。

我错过了什么吗?

更新:

我喜欢让POJO只使用String而不是ObjectId。让我们说我有这样的课程地方

@Document
public class Place {
  @Id
  private String id;
  private String name;
}

place.getId()将是一个字符串,但people.getPlaceId()将是一个ObjectId。我想避免这种不必要的映射。

4 个答案:

答案 0 :(得分:2)

如果您想真正引用数据库中的其他对象,请使用@DBRef提供的Spring Data注释。

您的更新代码如下所示:

@Document
public class People {

    private String name;

    @DBRef
    private Place place; 
    private String url;
}
然后,

Spring Data会自动将Place对象映射到您的People对象。在内部,这是通过引用唯一ObjectId来完成的。试试这段代码,看看你的mongo数据库。

有关详细信息,请查看:MongoDb with java foreign key

答案 1 :(得分:0)

为什么不让你离开现场作为ObjectId?

@Document
public class People {

    private String name;
    private ObjectId placesId; 
    private String url;
}

如果您想通过此字段进行查询,可以执行以下操作:

  • 列表

    List<String> ids // the ids as strings
    List<ObjectId> objIds = ids .stream()
                                .map(i -> new ObjectId(i))
                                .collect(Collectors.toList());
    
  • 对于单个字符串

    String id // single id
    ObjectId objId = new ObjectId(id);
    

答案 2 :(得分:0)

我有一个非常简单的解决方案:

vectorize

将其放在作为对象ID的属性上,然后ObjectId像字符串一样获取并插入

答案 3 :(得分:0)

解决方案是:

def minimizeBias(ratings):
ret_val =0    
for i in range(len(ratings)):
    diff =999999999
    index = 0
    if ratings[i] != -1:
        for j in range(i+1,len(ratings)):
            dif = abs(ratings[i] - ratings[j])
            if(dif<diff):
                index = j 
                diff = dif
    else:
        diff =0

    ratings[i] = -1
    ratings[index] = -1
    ret_val +=diff

#print(ratings)
return ret_val
              

这会将 POJO 字符串映射到 MongoDB 中的 ObjectId。

相关问题