Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webinar: MongoDB for Content Management

mongodb
May 17, 2012
1.6k

Webinar: MongoDB for Content Management

MongoDB's flexible schema makes it a great fit for your next content management application. MongoDB's data model makes it easy to catalog multiple content types with diverse meta data. In this session, we'll review schema design for content management, using GridFS for storing binary files, and how you can leverage MongoDB's auto-sharding to partition your content across multiple servers.

mongodb

May 17, 2012
Tweet

Transcript

  1. In this webinar •  Basics of a content management system

    •  Posts and Pages schema design •  Managing images with GridFS •  Searching content with tags •  Generating feeds from content
  2. Content Management •  Interface for publishing content •  Templates and

    layouts •  Rendering content pages for viewers
  3. A static page {      _id:  ObjectId(…),    nonce:

     ObjectId(…),    metadata:  {        type:  “basic-­‐page”,      section:  “my-­‐photos”,      slug:  “about”,      title:  “About  Us”,      created:  ISODate(…),      author:  {  _id:  ObjectId(…),  name:  “Rick”  },      tags:  [  …  ],        detail:  {  text:  “#  About  Us\n…”  }    }   }  
  4. A blog post {      …    metadata:  {

           …      type:  “blog-­‐entry”,      section:  “my-­‐blog”,      slug:  “2012-­‐03-­‐noticed-­‐the-­‐news”,      …      detail:  {        publish_on:  ISODate(…)          text:  “I  noticed  the  news!”        }    }   }  
  5. Publishing a node db.nodes.insert({          'nonce':  ObjectId(),

             'metadata':  {                  'section':  'myblog',                  'slug':  '2012-­‐03-­‐noticed-­‐the-­‐news',                  'type':  'blog-­‐entry',                  'title':  'Noticed  in  the  News',                  'created':  datetime.utcnow(),                  'author':  {  'id':  user_id,  'name':  'Rick'  },                  'tags':  [  'news',  'musings'  ],                  'detail':  {                          'publish_on':  datetime.utcnow(),                          'text':  'I  noticed  the  news  from  Washington  today…'  }                  }            })  
  6. Updating a node def  update_text(section,  slug,  nonce,  text):    

         result  =  db.nodes.update(                  {  'metadata.section':  section,                      'metadata.slug':  slug,                      'nonce':  nonce  },                  {  '$set':{'metadata.detail.text':  text,  'nonce’:  ObjectId()}},                  safe=True)          if  not  result['updatedExisting']:                  raise  ConflictError()  
  7. Indexes >>>  db.nodes.ensure_index([   ...        ('metadata.section',  1),

        ...        ('metadata.slug',  1)],     ...        unique=True)     And  Optionally:       >>>  db.nodes.ensure_index([   ...        ('metadata.section',  1),     ...        ('metadata.slug',  1),     ...        ('nonce',  1)  ])  
  8. Rendering a node node  =  db.nodes.find_one(  {  'metadata.section':  section,  

                                                             'metadata.slug':  slug  }  )  
  9. def  upload_new_photo(input_file,  section,  slug,  title,  author,  tags,  details):    

         fs  =  GridFS(db,  'cms.assets')          with  fs.new_file(                  content_type='image/jpeg',                  metadata=dict(                          type='photo',                          locked=datetime.utcnow(),                          section=section,                          slug=slug,                          title=title,                          created=datetime.utcnow(),                          author=author,                          tags=tags,                          detail=detail))  as  upload_file:                  while  True:                          chunk  =  input_file.read(upload_file.chunk_size)                          if  not  chunk:  break                          upload_file.write(chunk)          #  unlock  the  file          db.assets.files.update(                  {'_id':  upload_file._id},                  {'$set':  {  'locked':  None  }  }  )  
  10. Rendering a photo fs  =  GridFS(db,  'cms.assets')   with  fs.get_version({

     'metadata.section':  section,                                                                                  'metadata.slug':  slug,                                              ‘locked’:  None  })  as  img_fpo:            #  do  something  with  the  image  file  
  11. Indexes >>>  db.assets.files.ensure_index([   ...        ('metadata.section',  1),

        ...        ('metadata.slug',  1)],     ...        unique=True)  
  12. Tags {      _id:  ObjectId(…),    nonce:  ObjectId(…),  

     metadata:  {        type:  “basic-­‐page”,      section:  “my-­‐photos”,      slug:  “about”,      title:  “About  Us”,      created:  ISODate(…),      author:  {  _id:  ObjectId(…),  name:  “Rick”,        tags:  [  “awesome”,  “it’s  me!”  ],          detail:  {  text:  “#  About  Us\n…”  }    }   }  
  13. Adding tags Add  a  single  tag:       db.nodes.update(

     {  ‘metadata.section’:  section,                                        ‘metadata.slug’  :  slug  },                                    {  ‘$addToSet’  :  {  ‘tags’  :  ‘funny’  }    }  )     Add  multiple  tags:       db.nodes.update(  {  ‘metadata.section’:  section,                                        ‘metadata.slug’  :  slug  },                                    {  ‘$addToSet’  :  {  ‘tags’  :                                          {  ‘$each’  :  [  ‘interesting’,  ‘funny’  ]  }  }  }  )  
  14. Recently published articles  =  db.nodes.find({          'metadata.section':

     'my-­‐blog'          'metadata.published':  {  '$lt':  datetime.utcnow()  }  })   articles  =  articles.sort({'metadata.published':  -­‐1})  
  15. Indexing >>>  db.nodes.ensure_index(   ...          [

     ('metadata.section',  1),  ('metadata.published',  -­‐1)  ])  
  16. More resources •  Use Case Tutorials (including this one) http://docs.mongodb.org/manual/use-cases/

    •  What others are doing http://www.10gen.com/use-case/content-management