#AYearWithMongoDB
             The Tips
            By: @rizkyabdilah
Email: rizky@abdi.la / rizky@mindtalk.com
What is MongoDB?
Document database
Schema-free
Memory mapped
Ok, the tips..
#1. Avoid RegExp
Example case, Mindtalk username:
Valid regex ([a-zA-Z0-9_.]+)
No!
db.user.ensureIndex({name: 1})
db.user.insert({name: “Danny”})
db.user.find({name: /dAnny/i})
Yes
db.user.ensureIndex({lower_name: 1})
db.user.insert({name: “Danny”,
  lower_name: “danny”})
db.user.find({lower_name:
  “dAnny”.toLowerCase()})
Comparisson
Index not used when query using RegExp
#2. Tokenize field name
Because of schema-free, every document
  have a own schema (field-name or key in
  json)
#2. Tokenize field name
Because of schema-free, every document
  have a own schema (field-name or key in
  json)
All of your key-name go into your
  'valuable' RAM
#2. Tokenize field name
Because of schema-free, every document
  have a own schema (field-name or key in
  json)
All of your key-name go into your
  'valuable' RAM
Imagine if you've very-very long key-
  name, and it repeated in every
  document. No need to explain
Example Case: Ndayak Stream
How we tackle this
Original            Now:
  Implementation:
                    Index size ~ 12GB
> 136 million doc
                    Space size ~ 15GB
Index size > 60GB
                    AvgObjSize 112
Space size > 24GB     bytes
AvgObjSize 210
#3. Use single compound-key index
 Instead of many single-key index
No
db.post.ensureIndex({user_id: 1, timepos:
  -1})
db.post.ensureIndex({channel_id: 1,
  timepos: -1})
Query find
db.post.find({user_id:
  “uid”}).sort({timepos: -1})
db.post.find({channel_id:
  “ch_id”}).sort({timepos: -1})
Yes
db.post.ensureIndex({user_id:1,
  channel_id: 1, timepos: -1})
Query find, it will use the same index
db.post.find({user_id:
  “uid”}).sort({timepos:-1})
db.post.find({channel_id:
  “chid”}).sort({timepos:-1})
Later Discussions
Global write lock (introducing yield on
  MongoDB 2.0)
Normalize 'own schema'
Sharding?
Thank You
       Ps: don't forget to join channel
#EngineerBlog if you interested in advance :)

A Year With MongoDB: The Tips