2012-01-27 8 views
1

J'ai une question sur la conception d'index dans MongoDB.Indexation dans MongoDB - quel est le meilleur moyen

Dites que j'ai une collection d'utilisateurs et de groupes.

user { 
name : "" , 
age : 19 
} 

group { 
name : "" 
members : [], 
posts : [ { date : "" , author : "" , topic : "" }, { date : "" , 
author : "" , topic : "" } ......] 
} 

Il peut y avoir 1000 de groupes et chaque groupe peut avoir des millions de messages. Opérations I est souvent EFFECTUER:

  1. obtenir des postes en fonction de la date (70%)
  2. des messages de mise à jour (30%)

Donc, essentiellement je besoin d'indexer la date.

Ma question est:

Dois-je créer une nouvelle collection de messages comme

posts { 
name : "", date : "" , author : "" , topic : "" 
} 

et créer un index unique valeur à la date dans les postes collection

(db.posts.ensureIndex({posts : 1})) 

OU

Devrais-je inclure po sts à l'intérieur de l'objet groupe et créer un index intégré comme db.groups.ensureIndex({ posts.date : 1})

Lequel est le plus efficace? Quelle est la meilleure pratique si cela doit être à l'échelle de millions de messages?

Merci

Répondre

0

@ Z5h, je pense que vous avez mal compris le problème. Le problème était d'obtenir des publications d'un groupe particulier entre une plage de dates. et les stocker plus efficacement.

et après quelques réflexions et recherches, c'est ce que j'ai découvert.

  • D'abord, il y a une limite sur la taille du document (actuellement 16MB), et en tant que schéma post/messages augmentation de la taille, cela peut arrêt échelle un jour que le nombre de messages increase.and u ne peut pas ajouter une index pour effectuer une recherche dans un tableau de sous-documents, car les index ne concernent que des collections.Deuxièmement, si les publications sont stockées en tant que sous-documents incorporés, il n'y aurait aucun moyen de rechercher dans les publications d'un groupe dans une plage de dates. Je dois obtenir des tableaux entiers et faire le traitement du côté client, ce qui est inefficace. Il n'y a aucun moyen de comparer les objets de tableau basés sur un champ dans le sous-document dès maintenant. se référer this

  • donc une meilleure façon est de créer un message distinct collection, et qui ont des données Foll

    posts{ 
    group_name : objectID(<ID in groups collection>), 
    date : "", 
    author : "", 
    topic : "" 
    } 
    

De cette manière, je peux ainsi créer un index sur la date et obtenir toutes les données pour un groupe dans une plage de dates plus efficacement.

0

Si vous index sur un document (plusieurs paires clé/valeur, par opposition à une valeur), vous devez rechercher ce document exactement pour la requête d'utiliser l'index. (Par exemple, si vous ne connaissez que le nom, la date, l'auteur mais pas le sujet, l'index ne sera pas utilisé). Cela limite vraiment l'utilité dans votre cas.

Une meilleure option consiste à créer un index composé. Par exemple:
db.posts.ensureIndex({ posts.date : 1, posts.topic : 1, posts.author : 1});
Avec que vous pourriez rechercher efficacement:
messages par date ou
messages par date et sujet ou
messages par date, sujet et auteur.
voir http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeysIndexes

Questions connexes