在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。我想避免这种不必要的映射。
答案 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。