从 String 到 MongoDB ObjectID 的转换
Conversion from String to MongoDB ObjectID
我尝试将我的字符串 ID 转换为 MongoDB 对象 ID
public class relevancy_test extends Object implements Comparable<ObjectId> {
public static void main(String[] args) throws UnknownHostException {
MongoClient mongo = new MongoClient("localhost", 27017);
DB mydb = mongo.getDB("test");
DBCollection mycoll = mydb.getCollection("mytempcoll");
BasicDBObject query = null;
Map<ObjectId, DBObject> updateMap = new HashMap<ObjectId, DBObject>();
List<DBObject> dbobj = null;
DBCursor cursor = mycoll.find();
dbobj = cursor.toArray();
for (DBObject postObj : dbobj) {
String id = postObj.get("_id").toString();
ObjectId objId = new ObjectId((String) postObj.get("_id"));
updateMap.put(objId, postObj);
}
}
}
这里 (String) postObj.get("_id")
的形式是 "8001_469437317594492928_1400737805000"
在 运行 出现以下错误
Exception in thread "main" java.lang.IllegalArgumentException: invalid ObjectId [8001_469437317594492928_1400737805000]
at org.bson.types.ObjectId.<init>(ObjectId.java:181)
at org.bson.types.ObjectId.<init>(ObjectId.java:167)
at fetch_data_tanmay.relevancy_test.main(relevancy_test.java:48)
ObjectId是一个12字节的BSON类型
这里你的字符串“8001_469437317594492928_1400737805000”不是 12 字节的 BSON 类型。所以根据 ObjectId
更新
要使用具有唯一十六进制字符串的 ObjectId() 构造函数生成新的 ObjectId:
var stringObjectId = ObjectId("507f191e810c19729de860ea");
请确保字符串正确才能将字符串转换为 objectId。
从 List 中检索时直接将其转换为 ObjectId
for (DBObject postObj : dbobj) {
ObjectId objId = (ObjectId)postObj.get("_id");
updateMap.put(objId, postObj);
}
据我所知这里有两个问题:
- 如何获取ObjectID实例的正确id?
值 8001_469437317594492928_1400737805000
不是您可以在数据库中看到的十六进制值,而是时间、机器 ID、pid 和计数器组件的显式串联。该组件用于生成 HEX 值。要获取 HEX 值,您需要使用 ObjectID 实例的 ToString 方法。
这里参考ObjectID组件的解释:
https://api.mongodb.com/java/3.0/org/bson/types/ObjectId.html
- 如何创建具有特定 Id 的 ObjectId 实例
为了创建具有特定 HEX 值的新 ObjectID 实例,请使用:
var objectId = new ObjectId(hexStringId)
下面是一个可以为您服务的示例:
public List<Persona> findAlls() {
List<Persona> personas = new ArrayList();
MongoCollection<BasicDBObject> collection = baseDato.database.getCollection("persona", BasicDBObject.class);
try (MongoCursor<BasicDBObject> cursor = collection.find().iterator()) {
while (cursor.hasNext()) {
BasicDBObject theObj = cursor.next();
String _id = ((ObjectId) theObj.get("_id")).toHexString();
String nombre = (String) theObj.get("nombre");
String apellido = (String) theObj.get("apellido");
String usuario = (String) theObj.get("usuario");
String contrasenna = (String) theObj.get("contrasenna");
Persona persona = new Persona();
persona.setNombre(nombre);
persona.setApellido(apellido);
persona.setUsuario(usuario);
persona.setContrasenna(contrasenna);
personas.add(persona);
}
}
return personas;
}
我可以将 String 转换为 ObjectId,如下所示:
这里我正在更新 'address' 集合的邮政编码,假设您将得到如下 REST api 输入:
{
"id": "5b38a95eb96e09a310a21778",
"zip":"10012"
}
现在我要根据上面提到的id(mongodb中的一个ObjectId)找到地址记录。为此,我有一个 mongorepository,并使用以下代码查找地址记录:
@Repository
public interface AddressRepository extends MongoRepository<Address, String>{
@Query("{'_id': ?0}")
Address findByObjectId(ObjectId id);
}
并在您的 服务 class 中使用此存储库方法,如:
public void updateZipCode(Address addressInput){
Address address =
addressRepository.findByObjectId(new ObjectId(addressInput.getId()));
//here you will get address record based on the id
}
我尝试将我的字符串 ID 转换为 MongoDB 对象 ID
public class relevancy_test extends Object implements Comparable<ObjectId> {
public static void main(String[] args) throws UnknownHostException {
MongoClient mongo = new MongoClient("localhost", 27017);
DB mydb = mongo.getDB("test");
DBCollection mycoll = mydb.getCollection("mytempcoll");
BasicDBObject query = null;
Map<ObjectId, DBObject> updateMap = new HashMap<ObjectId, DBObject>();
List<DBObject> dbobj = null;
DBCursor cursor = mycoll.find();
dbobj = cursor.toArray();
for (DBObject postObj : dbobj) {
String id = postObj.get("_id").toString();
ObjectId objId = new ObjectId((String) postObj.get("_id"));
updateMap.put(objId, postObj);
}
}
}
这里 (String) postObj.get("_id")
的形式是 "8001_469437317594492928_1400737805000"
在 运行 出现以下错误
Exception in thread "main" java.lang.IllegalArgumentException: invalid ObjectId [8001_469437317594492928_1400737805000]
at org.bson.types.ObjectId.<init>(ObjectId.java:181)
at org.bson.types.ObjectId.<init>(ObjectId.java:167)
at fetch_data_tanmay.relevancy_test.main(relevancy_test.java:48)
ObjectId是一个12字节的BSON类型
这里你的字符串“8001_469437317594492928_1400737805000”不是 12 字节的 BSON 类型。所以根据 ObjectId
更新要使用具有唯一十六进制字符串的 ObjectId() 构造函数生成新的 ObjectId:
var stringObjectId = ObjectId("507f191e810c19729de860ea");
请确保字符串正确才能将字符串转换为 objectId。
从 List 中检索时直接将其转换为 ObjectId
for (DBObject postObj : dbobj) {
ObjectId objId = (ObjectId)postObj.get("_id");
updateMap.put(objId, postObj);
}
据我所知这里有两个问题:
- 如何获取ObjectID实例的正确id?
值 8001_469437317594492928_1400737805000
不是您可以在数据库中看到的十六进制值,而是时间、机器 ID、pid 和计数器组件的显式串联。该组件用于生成 HEX 值。要获取 HEX 值,您需要使用 ObjectID 实例的 ToString 方法。
这里参考ObjectID组件的解释: https://api.mongodb.com/java/3.0/org/bson/types/ObjectId.html
- 如何创建具有特定 Id 的 ObjectId 实例
为了创建具有特定 HEX 值的新 ObjectID 实例,请使用:
var objectId = new ObjectId(hexStringId)
下面是一个可以为您服务的示例:
public List<Persona> findAlls() {
List<Persona> personas = new ArrayList();
MongoCollection<BasicDBObject> collection = baseDato.database.getCollection("persona", BasicDBObject.class);
try (MongoCursor<BasicDBObject> cursor = collection.find().iterator()) {
while (cursor.hasNext()) {
BasicDBObject theObj = cursor.next();
String _id = ((ObjectId) theObj.get("_id")).toHexString();
String nombre = (String) theObj.get("nombre");
String apellido = (String) theObj.get("apellido");
String usuario = (String) theObj.get("usuario");
String contrasenna = (String) theObj.get("contrasenna");
Persona persona = new Persona();
persona.setNombre(nombre);
persona.setApellido(apellido);
persona.setUsuario(usuario);
persona.setContrasenna(contrasenna);
personas.add(persona);
}
}
return personas;
}
我可以将 String 转换为 ObjectId,如下所示:
这里我正在更新 'address' 集合的邮政编码,假设您将得到如下 REST api 输入:
{
"id": "5b38a95eb96e09a310a21778",
"zip":"10012"
}
现在我要根据上面提到的id(mongodb中的一个ObjectId)找到地址记录。为此,我有一个 mongorepository,并使用以下代码查找地址记录:
@Repository
public interface AddressRepository extends MongoRepository<Address, String>{
@Query("{'_id': ?0}")
Address findByObjectId(ObjectId id);
}
并在您的 服务 class 中使用此存储库方法,如:
public void updateZipCode(Address addressInput){
Address address =
addressRepository.findByObjectId(new ObjectId(addressInput.getId()));
//here you will get address record based on the id
}