我在使用Spring Data MongoDB进行更新查询时遇到问题。我将一些对象的_id检索为BigInteger值。然后我想进行以下查询:
Query query = new Query(Criteria.where("_id").is(id));
Update update = new Update();
update.set("version",version);
mongoOperations.updateFirst(query, update, Audit.class);
查询部分无法匹配任何文档,因为传递给is()
的id值必须以某种方式转换为ObjectId。我找不到关于这种转换的任何文档。将不胜感激任何帮助。
p.s。:SpringData Mongodb 1.2版
答案 0 :(得分:6)
您也可以手动转换它:
ObjectId convertedId = new ObjectId(bigInteger.toString(16));
Query query = new Query(Criteria.where("_id").is(convertedId));
答案 1 :(得分:1)
您可能想要编写自定义Spring转换器BigInteger => ObjectId和ObjectId =>的BigInteger。
请参阅此处的doc部分: http://static.springsource.org/spring-data/data-document/docs/current/reference/html/#d0e2670
------更新------
似乎这种转换器已经存在于Spring-Data-MongoDB库中: http://static.springsource.org/spring-data/data-document/docs/1.0.0.M1/api/org/springframework/data/document/mongodb/SimpleMongoConverter.ObjectIdToBigIntegerConverter.html
所以你只需要在Spring配置中指定它。
答案 2 :(得分:1)
或者,您可以在集合类或可能的基类中添加“id”字段,并使用org.springframework.data.annotation.Id对其进行注释,如下所示:
import org.springframework.data.annotation.Id;
public abstract class BaseDocument {
@Id
protected long id;
这将允许您执行表单的查询:
public boolean doesDocumentExist(Class clazz, long documentId) {
Query queryCriteria = new Query(Criteria.where("id").is(documentId));
return mongoTemplate.count(queryCriteria, clazz) == 1;
}
使用'@Id'注释您自己的id字段会将您的id存储为mongo objectId,从而避免您自己进行转换。
答案 3 :(得分:0)
//get the converter from the mongoTemplate
MappingMongoConverter converter = (MappingMongoConverter)mongoTemplate.getConverter();
//get the conversion service from the mongo converter
ConversionService conversionService = converter.getConversionService();
//iterate the status list and get the each id to add the arraylist
for(Status status: statusList){
ObjectId objectIdVal = conversionService.convert(status.getId(), ObjectId.class);
**//here status.getId() returns the BigInteger**
statusArrayList.add(objectIdVal);
}
//get the users list whose status is active and cancel
query.addCriteria(new Criteria().where("status.$id").in(statusArrayList));
List<User> usersList = mongoTemplate.find(query, User.class);
答案 4 :(得分:0)
您可以使用BigIngeter
的十六进制表示将ObjectId
转换为BigInteger
。但是,ObjectId
应该是24个字符长,解析较短的字符串将在Java中失败。因此,最好确保十六进制表示适当地填充0:
String hexString24 = StringUtils.leftPad(bigInteger.toString(16), 24, "0");
ObjectId convertedId = new ObjectId(hexString24);
Query query = new Query(Criteria.where("_id").is(convertedId));