2013-04-04 8 views
3

J'essaie de modéliser une relation plusieurs à plusieurs où un client «aime» un aliment.Mongo plusieurs à plusieurs

Je m'attends à obtenir beaucoup (millions) de ces relations, donc je ne voulais pas qu'ils se retrouvent tous dans une table de jointure qui ne pouvait pas évoluer.

J'ai créé deux collections de documents,

Customers 
- name etc 
- countOfLoves 
- loves [ ... ] 

et

Foods 
- name etc 
- countOfLoves 
- loves [ ... ] 

l'intérieur de chaque document est une collection de sous-document de représenter 'amours' les relations et un compte pour obtenir rapidement les totaux.

J'avais supposé que cela évoluerait bien car au lieu d'une requête sur une table avec des millions de lignes je pourrais juste obtenir un seul document et c'est un sous-tableau. Cependant, je rencontre un problème quand un client commence à aimer beaucoup d'aliments (et, inversement, quand un aliment est aimé par beaucoup de clients)

Voici la requête pour mettre à jour un document client quand un nouvel aliment est aimé. Dans ce cas, le client aime déjà 7000 autres aliments:

query: { _id: "354286" } 
update: { $push: { loves: { foodID: "354286", location: [ 55.752197, 37.6156 ] } }, $inc: { countOfLoves: 1 } } 
nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:10135199 10137ms 

Il y a deux questions ici vraiment,

a) Pourquoi cette prise de 10 secondes - est-il quelque chose au sujet de $ pousser que je ne sais pas

b) Existe-t-il un meilleur schéma pour Mongo qui peut modéliser ce type de relation?

(et, je suppose que (c) - Suis-je sur l'optimisation - dois-je faire une amours se joindre à la table et ce sera très bien)

Répondre

1

Une des raisons pour lesquelles je vois à être lent si la La taille du document est grande pour ne pas tenir à sa place, il sera déplacé à un autre endroit. Cela peut être de la raison de 10 secondes. Vous pouvez voir la discussion similaire ici: https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/FnL0mDWs5w0. Une des solutions pour avoir un tableau avec des valeurs factices lors de la création et vous utilisez un peu comment les mettre à jour sans ajouter de nouvelles amours. Dans ce cas peut-être vous devez opter pour une collection de plus comme Aime où pour chaque amour vous stockez le client Id et ce qu'il aime

+0

Une alternative à la création d'une 3e collection serait de permettre plusieurs enregistrements pour chaque aliment et client . Dans ce cas, vous pouvez mettre une limite sur le nombre d'amours pour chaque collection (10 par exemple), un pad pour ce nombre et ensuite passer à un nouvel enregistrement une fois que tous les emplacements sont pleins. Vous voudriez un indicateur "complet" dans chaque document qui ferait partie de votre index de recherche pour permettre une insertion rapide. –

+0

Hmmm cela semble une belle option, mais quelle est la façon possible de le rembourrer de manière agréable toute idée? – Devesh

+1

Voir la page suivante qui fournit des conseils sur le rembourrage manuel: http://docs.mongodb.org/manual/faq/developers/#can-i-manually-pad-documents-to-prevent-moves-during-updates –

Questions connexes