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)
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. –
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
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 –