#Stories are embedded docs in a Feed

class Feed
  include MongoMapper::Document
  many :stories
end

class Story
  include MongoMapper::EmbeddedDocument
  key :title, String
  key :posted_by, String
end

#create a feed
feed = Feed.create

#the standard way to add an embedded doc
story1 = Story.new(:title => "Coding", :posted_by => "Michael")
feed.stories << story1
feed.save! #this saves the entire feed document

#atomically add an embedded doc
story2 = Story.new(:title => "Eating", :posted_by => "Josh")
Feed.push(feed.id, :stories => story2.to_mongo)
## adds this story to the feed

#you can also do it this way if you already have the feed
story3 = Story.new(:title => "Sleeping", :posted_by => "Josh")
feed.push(:stories => story3.to_mongo) 

#atomically remove an embedded doc 
Feed.pull(feed.id, {:stories => {:posted_by => "Josh"}}) 
## removes all stories posted by Josh

#atomically edit an embedded doc
Feed.set({:_id => feed.id, "stories.title" => "Coding"}, "stories.$.title" => "Hacking")
## edits the title of the FIRST story with a title of "Coding" to "Hacking"
## notice the "dot" notation for getting to fields
## and the position element ("$"), which returns the *FIRST* of the documents returned in the query

## this example makes sense for manipulating single embedded documents, but to update multiple ones
## it probably makes more sense to use Ruby Array/Enumerable and save the whole document

## I've just been fiddling with this for the past day or so, so if I'm doing something wrong 
## (or if there's a better way to do some of this stuff), please let me know!