When the DBObject.keySet() rerturns a Set<String> that is an instance of StringRangeSet, performing keySet.contains("FOO") on it will throw NumberFormatException.
Caused due to the contains implementation that assume input is a valid number:
@Override public boolean contains(final Object o) { if (!(o instanceof String)) { return false; } int i = Integer.parseInt((String) o); return i >= 0 && i < size(); }
Using a non-number contains can be a valid use case when recursively iterating through a DBObject, trying to remove all "_class" fields that spring-data-mongo generate:
private void removeClassFields(DBObject dbObject){ Set<String> keys = dbObject.keySet(); if (keys.contains("_class")){ dbObject.removeField("_class"); } for (String key : keys) { if (dbObject.get(key) instanceof DBObject){ removeClassFields((DBObject) dbObject.get(key)); } } }