1. embedded documents?
Pierre-Louis Gottfrois
Bastien Murzeau
Apéro Ruby Bordeaux, 6 décembre 2011
mardi 6 décembre 11 1
2. • Qu’est ce qu’un document embedded ?
• Embedded or not ?
• Recherche dans les embeddeds
• Déclarations non standards
mardi 6 décembre 11 2
3. Qu’est-ce qu’un document
embedded ?
• Un document embedded est un document
enregistré dans un autre
• dispose des mêmes caractéristiques qu’un document standard
• représente un Model
• Un document embedded n’existe qu’au sein
de son document parent :
• toute interaction avec ce document doit se faire au travers de son
parent
mardi 6 décembre 11 3
5. “Relate” what you occasionally need,
“Embed” what you always need.
• Avantages :
• Facile a manipuler
• Jointure pre-construite pour gagner en
rapidite
• Inconvenients :
• Gros document (> 500k)
• Limit de 16MB
mardi 6 décembre 11 5
6. Embedded or not ?
• YES : stockage d’information en lien direct
avec le parent (tags, votes, bon de
commande, etc.)
• YES : optimisation des performances
(duplication des données mais requete plus
rapide)
• YES : stockage d’informations dites
“persistentes” (timeline, elements
supprimables, etc.)
mardi 6 décembre 11 6
7. // Tags
link = {
title: "RubyBdx",
url: "http://rubybdx.org/"
tags: ['ruby', 'rails', 'bordeaux']
}
// Save this link to the links collection
db.links.save(link)
// Build an index on the array
db.links.ensureIndex({tags : 1})
// Queries like this use an index:
db.links.find({tags : 'bordeaux'})
// Votes
{
'_id': ObjectId('4b980a6dea2c3f4579da141e'),
'voters': [
ObjectId('4b980a6dea2c3f4579da141f'),
ObjectId('4b980a6dea2c3f4579da143a'),
ObjectId('4b980a6dea2c3f4579da1429')
],
'votes': 3
}
mardi 6 décembre 11 7
8. Embedded or not ?
• NO : Un document MongoDB ne peut pas
grossir de manière ‘non prévue’ :
• Lors de la création d’une document, MongoDB alloue plus de mémoire
que la taille réellement occupée par le document => attention a ne pas
dépasser cette allocation
• Une collection devrait toujours stocker des éléments de tailles
relativement similaires
mardi 6 décembre 11 8
9. Recherche dans les
documents embeddeds
# Use the 'dot' notation on our conversation / message collections
# Find all conversation that contains message from given author
@conversations = Conversation.where("messages.author_id" => current_user.id)
# More complexe queries with mongodb
author_ids = [...]
@conversations = Conversation.where("messages.author_id" => {'$in' =>
author_ids})
mardi 6 décembre 11 9
10. Déclarations non standards
• Un peu de polymorphisme
• Pas de “embeded_in”
class Notification
embeds_one :object, :polymorphic => true
end
class Conversation
include Mongoid::Document
belongs_to :author, :class_name => 'User'
embeds_many :messages
end
mardi 6 décembre 11 10