Misc stuff about Voyage and MongoDB

Written on May 28 2012.

This blog post was written a long time ago and may not reflect my current opinion or might be technically out of date. Read with a grain of salt.

Esteban replied to my first post about Voyage. Unfortunately, my blog provider messed up when formatting the comment. Here’s a summary of his remarks:


Magritte is not necessary for the basic scenarios. Voyage is smart enough to infer the types of your instance variables and can serialize them. You don’t need to describe everything like you would do when building an UI with Magritte.

The Magritte descriptions are only needed when you want to override the defaults of want to have a one-to-many relationships.

In the future, it will be able to infer the to-many relations automatically but at the moment you still have to tell voyage how to deal with them.

^VOMongoToManyDescription new
    attributeName: 'myInstVar'; "Acts on this inst var"
    kindCollection: Set; "Set instead an OrderedCollection"
    beLazy; "I want that references to be retrieved lazily"

Browse VOMongoRelationDescription and its subclasses to see what is possible.

Embedded documents

As we've seen previously, it is pretty easy to map a relation. In our example, we declared both MQSpaceship and MQPilot as persistent by implementing isPersistent on the class side.

This isPersistent method has an unfortunate name. It actually means that a collection with the name of the class will be created in the database. If we hadn’t declared MQPilot persistent, it would have been completely embedded in the spaceship.

Ignore instance variable

Sometimes you do not want to serialize all your instance variables. In such cases, add a VOMongoTransientDescription like this:

  ^VOMongoTransientDescription new
    attributeName: ‘puppies’;

Now, the puppies instance variable will be ignored by the serializer and won’t be stored in Mongo.

That’s all for today. Once again, huge thanks to Esteban for this super nice library!