reverb / wordnik-oss

Wordnik Open Source Software
168 stars 39 forks source link

RestoreUtil incorrectly handles DBRefs #18

Open spigene opened 11 years ago

spigene commented 11 years ago

RestoreUtil fails to restore BSON dump which contains single DBRef in a document.

Steps to reproduce:

  1. 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) } );
  2. Make a BSON dump of user collection: mongodump -d test -o ~/tmp/
  3. 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).