MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB:dovresti pre-allocare un documento se usi $ addToSet o $ push?

È consigliato se è fattibile per il caso d'uso, cosa che di solito non lo è. I dati delle serie temporali rappresentano un'eccezione notevole. Non si applica davvero con $addToSet e $push perché tendono ad aumentare le dimensioni del documento facendo crescere un array.

Fermare. Sei sicuro di volere array in costante crescita con decine di migliaia di voci? Hai intenzione di interrogare se desideri che voci specifiche vengano restituite? Indicizzerai dei campi nelle voci dell'array? Probabilmente vorrai ripensare la struttura del tuo documento. Forse vuoi ogni data la voce deve essere un documento separato con campi come market , type , createdAt replicato in ciascuno? Non ti preoccuperai degli spostamenti dei documenti.

Perché l'array crescerà fino a 75.000 voci? Puoi fare meno voci per documento? Sono dati di serie temporali ? È fantastico poter preallocare documenti ed eseguire aggiornamenti sul posto con il motore di archiviazione mmap, ma non è fattibile per ogni caso d'uso e non è un requisito per il buon funzionamento di MongoDB.

No, questo non è molto utile. La dimensione del documento verrà calcolata in base alla dimensione BSON dei valori null nell'array, quindi quando sostituisci null con un altro tipo la dimensione aumenterà e otterrai comunque le riscritture dei documenti. Dovresti preallocare l'array con oggetti con tutti i campi impostati su un valore predefinito per il suo tipo, ad es.

{
    "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
}