从字符串转换为MongoDB ObjectID

Tan*_*thi 3 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

(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)
Run Code Online (Sandbox Code Playgroud)

小智 5

我看到这里有两个问题:

  1. 如何获取ObjectID实例的正确ID?

该值8001_469437317594492928_1400737805000不是您可以在数据库中看到的十六进制值,而是时间,机器ID,PID和计数器组成部分的明确串联。该组件用于生成十六进制值。要获取十六进制值,您需要使用ObjectID实例的方法ToString。

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

  1. 如何创建具有特定ID的ObjectId实例

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