La traduzione dell'articolo è stata preparata alla vigilia dell'inizio del corso
Highlights:
- È estremamente importante sviluppare uno schema anche se è facoltativo in MongoDB.
- Allo stesso modo, gli indici devono corrispondere allo schema e ai modelli di accesso.
- Evitare di utilizzare oggetti di grandi dimensioni e array di grandi dimensioni.
- Fai attenzione alle impostazioni di MongoDB, soprattutto quando si tratta di sicurezza e affidabilità.
- MongoDB non dispone di un ottimizzatore di query, quindi devi fare attenzione quando esegui operazioni di query.
Lavoro con i database da molto tempo, ma ho scoperto MongoDB solo di recente. Ci sono alcune cose che vorrei sapere prima di iniziare a lavorarci. Quando una persona ha già esperienza in un determinato campo, ha nozioni preconcette su cosa sono i database e cosa fanno. Nella speranza di renderlo più facile da comprendere per gli altri, presento un elenco di errori comuni.
Creazione di un server MongoDB senza autenticazione
Sfortunatamente, MongoDB viene installato senza autenticazione per impostazione predefinita. Per una workstation a cui si accede localmente, questa pratica è normale. Ma poiché MongoDB è un sistema multiutente a cui piace utilizzare grandi quantità di memoria, sarà meglio metterlo su un server con quanta più RAM possibile, anche se lo utilizzerai solo per lo sviluppo. L'installazione sul server tramite la porta predefinita può essere problematica, soprattutto se nella richiesta è possibile eseguire qualsiasi codice Javascript (ad esempio, $where
come idea per
Esistono diversi metodi di autenticazione, ma il più semplice consiste nell'impostare un ID utente/password. Usa questa idea mentre pensi all'autenticazione fantasiosa basata su
Non dimenticare di associare la tua superficie di attacco a MongoDB
,
o
. Poiché i file di dati non sono crittografati in MongoDB standard, ha senso eseguire MongoDB
Errore durante lo sviluppo del circuito
MongoDB non utilizza uno schema. Ma ciò non significa che lo schema non sia necessario. Se desideri semplicemente archiviare documenti senza uno schema coerente, archiviarli può essere semplice e veloce, ma recuperarli in un secondo momento può essere difficile.
Articolo classico "
Non dimenticare l'ordinamento
Dimenticare l'ordinamento può causare maggiore frustrazione e perdere più tempo rispetto a qualsiasi altra configurazione errata. Per impostazione predefinita MongoBD utilizza
Crea raccolte con documenti di grandi dimensioni
MongoDB è felice di ospitare documenti di grandi dimensioni fino a 16 MB in raccolte e
Creazione di documenti con array di grandi dimensioni
I documenti possono contenere array. È meglio se il numero di elementi nell'array è lontano da un numero di quattro cifre. Se gli elementi vengono aggiunti frequentemente a un array, diventerà troppo grande per il documento che lo contiene e dovrà esserlo
MongoDB ha qualcosa chiamato
Potresti pensare di poter fare a meno dell'indicizzazione degli array. Sfortunatamente, la mancanza di indici potrebbe causare altri problemi. Poiché i documenti vengono scansionati dall'inizio alla fine, la ricerca degli elementi alla fine dell'array richiederà più tempo e la maggior parte delle operazioni associate a tale documento verranno eseguite
Non dimenticare che l'ordine delle fasi in un'aggregazione è importante
In un sistema di database con un ottimizzatore di query, le query che scrivi sono spiegazioni di ciò che desideri ottenere, non di come ottenerlo. Questo meccanismo funziona in analogia con l'ordinazione al ristorante: di solito si ordina semplicemente un piatto, senza dare istruzioni dettagliate al cuoco.
In MongoDB, istruisci il cuoco. Ad esempio, è necessario assicurarsi che i dati passino reduce
il più presto possibile nella pipeline utilizzando $match
и $project
e l'ordinamento avviene solo dopo reduce
e che la ricerca avvenga esattamente nell'ordine desiderato. Avere un ottimizzatore di query che elimina il lavoro non necessario, sequenzia in modo ottimale i passaggi e seleziona i tipi di join può rovinarti. Con MongoDB hai più controllo a scapito della comodità.
Strumenti come
Utilizzo della registrazione rapida
Non impostare mai le opzioni di scrittura di MongoDB per avere un'alta velocità ma una bassa affidabilità. Questa modalità "archivia e dimentica" sembra veloce perché il comando viene restituito prima che avvenga la scrittura. Se il sistema si arresta in modo anomalo prima che i dati vengano scritti su disco, andranno persi e finiranno in uno stato incoerente. Fortunatamente, MongoDB a 64 bit ha la registrazione abilitata.
I motori di archiviazione MMAPv1 e WiredTiger utilizzano la registrazione per impedire ciò, sebbene WiredTiger possa ripristinare l'ultimo file coerente
L'inserimento nel journal garantisce che il database sia in uno stato coerente dopo il ripristino e conservi tutti i dati finché non vengono scritti nel registro. La frequenza delle registrazioni è configurata utilizzando il parametro
.
Per essere sicuri delle voci, assicurati che la registrazione sia abilitata nel file di configurazione
e la frequenza delle registrazioni corrisponde alla quantità di informazioni che puoi permetterti di perdere.
Ordinamento senza indice
Durante la ricerca e l'aggregazione, spesso è necessario ordinare i dati. Speriamo che ciò avvenga in una delle fasi finali, dopo aver filtrato il risultato per ridurre la quantità di dati da ordinare. E anche in questo caso, per l'ordinamento ti servirà
Se non esiste un indice adatto, MongoDB ne farà a meno. Esiste un limite di memoria di 32 MB sulla dimensione totale di tutti i documenti contenuti
Ricerca senza supporto dell'indice
Le query di ricerca eseguono una funzione simile all'operazione JOIN in SQL. Per funzionare al meglio hanno bisogno dell'indice del valore della chiave utilizzata come chiave esterna. Questo non è ovvio perché l'uso non si riflette explain()
. Tali indici sono in aggiunta all'indice scritto explain()
, che a sua volta viene utilizzato dagli operatori di gasdotti $match
и $sort
, quando si incontrano all'inizio del gasdotto. Gli indici ora possono coprire qualsiasi fase
Disattivazione dell'utilizzo degli aggiornamenti multipli
metodo
utilizzato per modificare parte di un documento esistente o l'intero documento, fino ad una sostituzione completa, a seconda del parametro specificato
. Ciò che non è così ovvio è che non elaborerà tutti i documenti nella raccolta a meno che non si imposti l'opzione
per aggiornare tutti i documenti che soddisfano i criteri della richiesta.
Non dimenticare l'importanza dell'ordine delle chiavi in una tabella hash
In JSON, un oggetto è costituito da una raccolta non ordinata di dimensioni pari a zero o più coppie nome/valore, dove nome è una stringa e valore è una stringa, un numero, un valore booleano, null, un oggetto o un array.
Sfortunatamente, BSON pone molta enfasi sull'ordine durante la ricerca. In MongoDB, l'ordine delle chiavi all'interno degli oggetti integrati { firstname: "Phil", surname: "factor" }
- non è lo stesso di { { surname: "factor", firstname: "Phil" }
. Cioè, devi memorizzare l'ordine delle coppie nome/valore nei tuoi documenti se vuoi essere sicuro di trovarli.
Non confondere "nullo" и "non definito"
Valore "non definito" non è mai stato valido in JSON, secondo $null
, che non è sempre una buona soluzione.
l'uso di $limit()
без $sort()
Molto spesso, quando si sviluppa in MongoDB, è utile vedere solo un campione del risultato che verrà restituito da una query o da un'aggregazione. Per questo compito avrai bisogno $limit()
, ma non dovrebbe mai essere nel codice finale a meno che non lo usi prima $sort
. Questa meccanica è necessaria perché altrimenti non sarà possibile garantire l'ordine del risultato e non sarà possibile visualizzare i dati in modo affidabile. Nella parte superiore del risultato otterrai voci diverse a seconda dell'ordinamento. Per funzionare in modo affidabile, le query e le aggregazioni devono essere deterministiche, ovvero produrre gli stessi risultati ogni volta che vengono eseguite. Codice che contiene $limit()
, ma no $sort
, non sarà deterministico e potrebbe successivamente causare errori difficili da rintracciare.
conclusione
L'unico modo per rimanere delusi da MongoDB è confrontarlo direttamente con un altro tipo di database, come un DBMS, o arrivare ad utilizzarlo in base a determinate aspettative. È come paragonare un'arancia ad una forchetta. I sistemi di database servono a scopi specifici. È meglio semplicemente comprendere e apprezzare queste differenze per te stesso. Sarebbe un peccato esercitare pressioni sugli sviluppatori MongoDB lungo un percorso che li ha costretti a intraprendere il percorso DBMS. Voglio vedere modi nuovi e interessanti per risolvere vecchi problemi, come garantire l'integrità dei dati e creare sistemi di dati resistenti ai guasti e agli attacchi dannosi.
L'introduzione della transazionalità ACID da parte di MongoDB nella versione 4.0 è un buon esempio di introduzione di importanti miglioramenti in modo innovativo. Le transazioni multi-documento e multi-istruzione sono ora atomiche. È anche possibile regolare il tempo necessario per acquisire i blocchi e terminare le transazioni bloccate, nonché modificare il livello di isolamento.
Per saperne di più:
Fonte: habr.com