I have a program that will store many instances of one class, let\'s say up to 10.000 or more. The class instances have several properties that I need from time to time, but
Use a Set of Documents. It has most of the properties you want (constant-time lookup and does not allow duplicates),. Smalltalkers would tell you that using a collection that already has the properties you want is most of the battle.
Use a Hash of Documents by document id, with ||= for conditional insertion (rather than has_key?).
Hashes are designed for constant-time insertion and lookup. Ruby's Set uses a Hash internally.
Be aware that your Document objects will need to implement #hash and #eql? properly in order for them to behave as you would expect as Hash keys or members of a set, as these are used to define hash equality.