Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Conversion from String to MongoDB ObjectID

I tried converting my String ID to 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);
        }
    }
}

Here (String) postObj.get("_id") is of form "8001_469437317594492928_1400737805000"

On running following error shows up

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)
like image 304
Tanmay Awasthi Avatar asked Dec 20 '22 05:12

Tanmay Awasthi


1 Answers

As I see there are two issue here:

  1. How to get proper id of ObjectID instance?

The value 8001_469437317594492928_1400737805000 is not a HEX value which you can see in the DB but an explicit concatenation of time, machine id, pid and counter components. This components are used to generate HEX value. To get HEX value you need to use method ToString of your ObjectID instance.

Reference to explanation of ObjectID components here: https://api.mongodb.com/java/3.0/org/bson/types/ObjectId.html

  1. How to create ObjectId instance with specific Id

In order to create new ObjectID instance with specific HEX value use this: var objectId = new ObjectId(hexStringId)

like image 52
Vadzim Dabravolski Avatar answered Jan 04 '23 14:01

Vadzim Dabravolski