7

Hi I need to convert Mongo Document to DBObject (BasicDBObject).

I am uploading a file to mongo using GridFS and I want to set metadata, which I get in document. I know Document is pretty much the same as DBObject. I know I can do something like this:

Document doc = new Document();
BasicDBObject.parse(doc.toJson());

But isn't this needlessly performance heavy?

The gridFS method setMetaData() accepts only DBObject so i have to convert it.

Is there a better way of doing that rather then converting it to string and back ?

  • *isnt this needlessly performace heavy* why do you believe so? – Naman Sep 13 '17 at 08:07
  • It's actually kind of odd and seems more of an oversight that the type has not been updated here. However the simple answer is of course it's just a `Map`, and as such behaves just like any other. – Neil Lunn Sep 13 '17 at 08:20
  • Ok maybye its not performance heavy but at least it seemed pointless for me to convert it to string ant than back. – František Jeřábek Sep 13 '17 at 08:51
  • This is the only way it will work if you have embedded documents. Accepted answer won't work. – zendu Jan 26 '18 at 05:02

2 Answers2

11

You are kind of micro-optimizing here.

However, since both classes are implementations of Map, you can just do:

Document document = new Document();
BasicDBObject basicDBObject = new BasicDBObject(document);

Internally this does a Map#putAll operation that puts all entries of the Document map into the BasicDbObject map.

Luciano van der Veekens
  • 6,307
  • 4
  • 26
  • 30
8

I know this is an old question and there is an accepted answer however it is not correct.

The proposed answer only does a shallow conversion between Document and DBOject. If your Json object contains nested objects or lists they will not be converted properly.

I got around this problem by serialising to JSON string. It is not efficient at all but might be enough in most cases, and at least it is correct:

public final class BsonConverter {
    public static Document toDocument(DBObject dbObject) {
        return Document.parse(dbObject.toString());
    }
    public static DBObject toDBObject(Document document) {
        return BasicDBObject.parse(document.toJson());
    }
}
phoenix7360
  • 2,807
  • 6
  • 30
  • 41