Comprendre la limite de taille de document MongoDB BSON
De MongoDB Le Guide Définitif:
Les Documents de plus de 4 Mo (convertis en BSON) ne peuvent pas être enregistré à la base de données. C'est une limite quelque peu arbitraire (et peut être élevé à l'avenir) ; c'est surtout pour empêcher la mauvaise conception du schéma et assurer des performances constantes.
Je ne comprends pas cette limite, cela signifie-t-il Qu'un Document contenant un article de Blog avec beaucoup de commentaires qui est plus grand que 4MB ne peut pas être stocké comme un seul le document?
Cela compte-t-il aussi les documents imbriqués?
Que faire si je voulais un document qui vérifie les modifications apportées à une valeur. (Il finira par croître, dépassant la limite de 4MB.)
J'espère que quelqu'un explique cela correctement.
Je viens de commencer à lire sur MongoDB (première base de données nosql dont j'apprends).
Je vous Remercie.
6 réponses
Tout d'abord, ceci est en fait soulevé dans la prochaine version à 8MB
ou 16MB
... mais je pense que pour mettre cela en perspective, Eliot de 10gen (qui a développé MongoDB) le met mieux:
MODIFIER: La taille a été officiellement 'élevé' à 16MB
Donc, sur votre exemple de blog, 4MB est effectivement beaucoup.. Exemple, le texte complet décompresse de " guerre de Les Mondes " est seulement 364k (html): http://www.gutenberg.org/etext/36
Si votre billet de blog est aussi long avec que beaucoup de commentaires, je ne suis pas je vais le lire:)
Pour trackbacks, si vous dédié 1 MB pour eux, vous pourriez facilement avoir plus plus de 10k (probablement plus proche de 20k)
Donc, sauf pour vraiment bizarre situations, ça va marcher très bien. Et dans le cas d'exception ou le spam, je vraiment ne pensez pas que vous voudriez un objet 20mb de toute façon. Je pense que le plafonnement trackbacks comme 15k ou plus fait beaucoup de sens, pas de importe ce que pour la performance. Ou à boîtier moins spécial si jamais arriver.
-Eliot
Je pense que vous auriez du mal à atteindre la limite ... et au fil du temps, si vous mettez à niveau ... vous devrez vous inquiéter de moins en moins.
le point principal de la limite est de ne pas utiliser toute la RAM sur votre serveur (car vous devez charger tous les MB
du document dans la RAM lorsque vous l'interrogez.)
, Donc la limite est certains % de RAM utilisable normale sur un système commun ... qui continuera à croître d'année en année.
Remarque sur le stockage des fichiers dans MongoDB
Si vous avez besoin de stocker des documents (ou des fichiers) plus grands que 16MB
, vous pouvez utiliser l'API GridFS qui va automatiquement diviser les données en segments et les diffuser vers vous (évitant ainsi le problème avec les limites de taille / RAM.)
Au lieu de stocker un fichier dans un seul document, GridFS divise le fichier en stocke chaque morceau comme un document séparé.
GridFS utilise deux collections pour stocker les fichiers. Une collection stocke les morceaux de fichier, et l'autre stocke les métadonnées de fichier.
Vous pouvez utiliser cette méthode pour stocker des images, des fichiers, des vidéos, etc. dans la base de données autant que dans une base de données SQL. J'ai utilisé cela pour stocker même des fichiers vidéo multi-gigaoctets.
Beaucoup dans la communauté préféreraient pas de limite avec des avertissements sur les performances, voir ce commentaire pour un argument bien motivé: https://jira.mongodb.org/browse/SERVER-431?focusedCommentId=22283&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-22283
Mon avis, les développeurs principaux sont têtus à propos de ce problème parce qu'ils ont décidé que c'était une "fonctionnalité" importante dès le début. Ils ne vont pas le changer de sitôt parce que leurs sentiments sont blessés que personne s'en doute. Un autre exemple de personnalité et de politique portant atteinte à un produit dans les communautés open source, mais ce n'est pas vraiment un problème paralysant.
Pour poster une réponse de clarification ici pour ceux qui sont dirigés ici par Google.
La Taille du document inclut tout dans le document, y compris les sous-documents, les objets imbriqués, etc.
Donc un document de:
{
_id:{},
na: [1,2,3],
naa: [
{w:1,v:2,b:[1,2,3]},
{w:5,b:2,h:[{d:5,g:7},{}]}
]
}
A une taille maximale de 16meg.
Les Sbudocuments et les objets imbriqués sont tous comptés dans la taille du document.
Profondeur imbriquée pour les Documents BSON: MongoDB ne prend pas en charge plus de 100 niveaux d'imbrication pour les documents BSON.
Je n'ai pas encore vu de problème avec la limite qui n'impliquait pas de gros fichiers stockés dans le document lui-même. Il existe déjà une variété de bases de données qui sont très efficaces pour stocker/récupérer des fichiers volumineux; ils sont appelés systèmes d'exploitation. La base de données existe en tant que couche sur le système d'exploitation. Si vous utilisez une solution NoSQL pour des raisons de performances, pourquoi voudriez-vous ajouter une surcharge de traitement supplémentaire à l'accès de vos données en plaçant la couche DB entre votre application et vos données?
JSON est un format de texte. Donc, si vous accédez à vos données via JSON, cela est particulièrement vrai si vous avez des fichiers binaires car ils doivent être encodés en uuencode, hexadécimal ou base 64. Le chemin de conversion peut ressembler à
Fichier binaire JSON (encodé) BSON (encodé)
Il serait plus efficace de mettre le chemin (URL) vers le fichier de données dans votre document et de conserver les données elles-mêmes en binaire.
Si vous voulez vraiment les garder fichiers de longueur inconnue dans votre base de données, alors vous feriez probablement mieux de les mettre dans GridFS et de ne pas risquer de tuer votre concurrence lorsque les gros fichiers sont accessibles.
Peut-être stocker un article de blog -> comments relation dans une base de données non relationnelle n'est pas vraiment le meilleur design.
Vous devriez probablement stocker des commentaires dans une collection séparée pour les articles de blog de toute façon.
[Modifier]
Voir les commentaires ci-dessous pour plus de détails.