RestoreUtil fails to restore BSON dump which contains single DBRef in a document.
Steps to reproduce:
Insert following sample documents into new collection:
db.user.insert( { name : "John Doe" } ); var user = db.user.findOne( { name : "John Doe" } ); db.user.insert( { name : "Jane Doe" , father : DBRef("user", user._id) } );
Make a BSON dump of user collection:
mongodump -d test -o ~/tmp/
Invoke RestoreUtil passing the created dump:
./bin/run.sh com.wordnik.system.mongodb.RestoreUtil -i ~/tmp/test/ -D -d test
The last step finishes with following exception:
restoring file user.bson to collection user java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$ref') at com.mongodb.DBCollection.validateKey(DBCollection.java:1444) at com.mongodb.DBCollection._checkKeys(DBCollection.java:1425) at com.mongodb.DBCollection._checkKeys(DBCollection.java:1415) at com.mongodb.DBCollection._checkObject(DBCollection.java:1400) at com.mongodb.DBCollection.save(DBCollection.java:799) at com.mongodb.DBCollection.save(DBCollection.java:785) at com.wordnik.system.mongodb.RestoreUtil.write(RestoreUtil.java:162) at com.wordnik.system.mongodb.RestoreUtil.restore(RestoreUtil.java:129) at com.wordnik.system.mongodb.RestoreUtil.run(RestoreUtil.java:75) at com.wordnik.system.mongodb.RestoreUtil.main(RestoreUtil.java:61)
Possible solution:
Use DefaultDBDecoder's method decode instead of readObject at line 125 (in this case MongoDB Java API correctly reconstructs objects with DBRefs from BSON dump).
RestoreUtil fails to restore BSON dump which contains single DBRef in a document.
Steps to reproduce:
db.user.insert( { name : "John Doe" } ); var user = db.user.findOne( { name : "John Doe" } ); db.user.insert( { name : "Jane Doe" , father : DBRef("user", user._id) } );
mongodump -d test -o ~/tmp/
./bin/run.sh com.wordnik.system.mongodb.RestoreUtil -i ~/tmp/test/ -D -d test
The last step finishes with following exception:
restoring file user.bson to collection user java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$ref') at com.mongodb.DBCollection.validateKey(DBCollection.java:1444) at com.mongodb.DBCollection._checkKeys(DBCollection.java:1425) at com.mongodb.DBCollection._checkKeys(DBCollection.java:1415) at com.mongodb.DBCollection._checkObject(DBCollection.java:1400) at com.mongodb.DBCollection.save(DBCollection.java:799) at com.mongodb.DBCollection.save(DBCollection.java:785) at com.wordnik.system.mongodb.RestoreUtil.write(RestoreUtil.java:162) at com.wordnik.system.mongodb.RestoreUtil.restore(RestoreUtil.java:129) at com.wordnik.system.mongodb.RestoreUtil.run(RestoreUtil.java:75) at com.wordnik.system.mongodb.RestoreUtil.main(RestoreUtil.java:61)
Possible solution:
Use DefaultDBDecoder's method
decode
instead ofreadObject
at line 125 (in this case MongoDB Java API correctly reconstructs objects with DBRefs from BSON dump).