从String转换为MongoDB ObjectID

时间:2015-04-10 05:09:55

标签: java mongodb mongodb-java

我尝试将我的String ID转换为MongoDB ObjectID

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)

5 个答案:

答案 0 :(得分:5)

我认为这里有两个问题:

  1. 如何获取ObjectID实例的正确ID?
  2. 8001_469437317594492928_1400737805000不是您可以在数据库中看到的HEX值,而是时间,机器ID,pid和计数器组件的显式串联。该组件用于生成HEX值。要获取HEX值,您需要使用ObjectID实例的方法ToString。

    此处参考ObjectID组件的说明: http://api.mongodb.com/java/current/org/bson/types/ObjectId.html

    1. 如何使用特定ID
    2. 创建ObjectId实例

      为了创建具有特定HEX值的新ObjectID实例,请使用以下命令: var objectId = new ObjectId(hexStringId)

答案 1 :(得分:1)

以下是一个为您服务的示例:

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;
    }

答案 2 :(得分:0)

ObjectId是一个12字节的BSON类型

此处您的字符串“8001_469437317594492928_1400737805000”不是12字节BSON类型。所以根据ObjectId

进行更新

使用带有唯一十六进制字符串的ObjectId()构造函数生成新的ObjectId:

var stringObjectId = ObjectId("507f191e810c19729de860ea");

请将字符串设置为正确以将字符串转换为objectId。

答案 3 :(得分:0)

从List中检索时,将其直接转换为ObjectId

 for (DBObject postObj : dbobj) {
        ObjectId objId = (ObjectId)postObj.get("_id");
        updateMap.put(objId, postObj);
}

答案 4 :(得分:0)

我能够将String转换为ObjectId,如下所示:

在这里,我正在更新“地址”集合的邮政编码,假设您将获得 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);

}

并在您的服务类中使用此存储库方法,例如:

    public void updateZipCode(Address addressInput){
        Address address = 
addressRepository.findByObjectId(new ObjectId(addressInput.getId()));
        //here you will get address record based on the id
    }