There is some documentation on updating mongoDB documents on the mongo gem page, and a little more on the wiki Tutorial page.

From those I learned how to change the value of a single field using $set (in Ruby):

coll.update( { "doe" => "3BL", "birth_date" => "2014-10-24" }, 
             { "$set" => {"survived" => 9 } } )

(Note: Dates are still strings at this stage of the project.)

Nice, but I need to append data, not just replace it. Working with this document:

{"type" => "litter", "litter_id" => "43", "doe" => "3BL", "buck" => "C16", 
  "birth_date" => "2014-10-24", "kindled" => 10, "survived" => 9,
  "weights" => [
    {"weight" => 0.5, "date" => "2014-10-29", "notes" => "well fed"},
    {"weight" => 0.7, "date" => "2014-10-31", "notes" => "doing fine"}
   ],
  "retained" => ["431","436"]
}

I need to add information to both of the arrays, weights and retained.

The mongoDB documentation on update says that the answer is $push, but the Modify Document tutorial has no examples. I finally found some on this page.

Appending data looks like this:

require 'mongo'
db = Mongo::Connection.new.db("mydb")
coll = db["nivens"]

coll.update( { "doe" => "3BL", "birth_date" => "2014-10-24" }, 
             { "$push" => {"retained" => "434"} } )

new_weight = { "weight" => 0.9, "date" => "2014-11-05", "notes" => "very fat" }
coll.update( { "doe" => "3BL", "birth_date" => "2014-10-24" }, 
             { "$push" => { "weights" => new_weight } } )

The first parameter to update selects the litter we want to update by giving the doe’s identification code along with the birth date. The second parameter adds a new value to the end of the specified array.

After these changes, the document looks like this:

{"_id"=>BSON::ObjectId('545d155b7e12bd6f08000001'), 
"type"=>"litter", "litter_id"=>"43", "doe"=>"3BL", "buck"=>"C16", 
"birth_date"=>"2014-10-24", "kindled"=>10, "survived"=>9,
   "weights"=>[
      {"weight"=>0.5, "date"=>"2014-10-29", "notes"=>"well fed"}, 
      {"weight"=>0.7, "date"=>"2014-10-31", "notes"=>"doing fine"},
      {"weight"=>0.9, "date"=>"2014-11-05", "notes"=>"very fat"}
	], 
   "retained"=>["431", "436", "434"]}

You can see the new values at the end of the weights and retained arrays.