MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoDB :devez-vous pré-allouer un document si vous utilisez $addToSet ou $push ?

Il est recommandé si cela est faisable pour le cas d'utilisation, ce qui n'est généralement pas le cas. Les données de séries chronologiques constituent une exception notable. Cela ne s'applique pas vraiment avec $addToSet et $push car ils ont tendance à augmenter la taille du document en développant un tableau.

Arrêt. Êtes-vous sûr de vouloir des tableaux en croissance constante avec des dizaines de milliers d'entrées ? Allez-vous demander des entrées spécifiques en retour ? Allez-vous indexer des champs dans les entrées du tableau ? Vous souhaitez probablement repenser la structure de votre document. Peut-être que vous voulez chaque data l'entrée doit être un document séparé avec des champs comme market , type , createdAt répliqué dans chacun? Vous n'auriez pas à vous soucier des déplacements de documents.

Pourquoi le tableau passera-t-il à 75 000 entrées ? Pouvez-vous faire moins d'entrées par document ? S'agit-il de données de séries temporelles ? C'est formidable de pouvoir préallouer des documents et d'effectuer des mises à jour sur place avec le moteur de stockage mmap, mais ce n'est pas faisable pour tous les cas d'utilisation et ce n'est pas une exigence pour que MongoDB fonctionne bien.

Non, ce n'est pas vraiment utile. La taille du document sera calculée en fonction de la taille BSON des valeurs nulles dans le tableau, donc lorsque vous remplacez null avec un autre type, la taille augmentera et vous obtiendrez de toute façon des réécritures de documents. Vous auriez besoin de préallouer le tableau avec des objets avec tous les champs définis sur une valeur par défaut pour son type, par exemple

{
    "date" : ISODate("1970-01-01T00:00:00Z")    // use a date type instead of a string date
    "price" : 0,
    "amount" : 0,
    "tid" : "000000", // assuming 7 character code - strings icky for default preallocation
    "type" : "none"    // assuming it's "buy" or "sell", want a default as long as longest real values
}