La traduzione dell'articolo è stata preparata in vista dell'inizio del corso .

Punti chiave:
- È fondamentale sviluppare uno schema anche se in MongoDB non è obbligatorio.
- Allo stesso modo, gli indici devono corrispondere al tuo schema e ai modelli di accesso.
- Evita di utilizzare oggetti grandi e array di grandi dimensioni.
- Fai attenzione alle impostazioni di MongoDB, soprattutto per quanto riguarda la sicurezza e l'affidabilità.
- In MongoDB non esiste un ottimizzatore di query, quindi devi fare attenzione quando esegui operazioni di richiesta.
Lavoro con i database da molto tempo, ma ho appena scoperto MongoDB. Ci sono alcune cose che avrei voluto sapere prima di iniziare a usarlo. Quando una persona ha già esperienza in un certo campo, ha preconcetti su cosa siano i database e cosa facciano. Nella speranza di semplificare la comprensione per gli altri, presento un elenco degli errori comuni.
Creare un server MongoDB senza autenticazione
Sfortunatamente, MongoDB viene installato per impostazione predefinita senza autenticazione. Per una workstation accessibile localmente, questa pratica è normale. Tuttavia, poiché MongoDB è un sistema multiutente che tende a utilizzare grandi quantità di memoria, è meglio installarlo su un server con la massima quantità di RAM possibile per le vostre esigenze, anche se intendete utilizzarlo solo per lo sviluppo. L'installazione su un server tramite la porta predefinita può risultare problematica, specialmente se è possibile eseguire qualsiasi codice JavaScript nella richiesta (ad esempio, $where come idea per ).
Esistono diversi metodi di autenticazione, ma il più semplice è impostare un ID/password per l'utente. Seguite questa idea mentre riflettete su un'autenticazione più elaborata basata su . Per quanto riguarda la sicurezza, MongoDB deve essere sempre aggiornato e i log devono sempre essere controllati per accessi non autorizzati. A me, per esempio, piace scegliere una porta diversa come porta predefinita.
Non dimenticate di legare la superficie di attacco a MongoDB
contiene ottimi consigli per ridurre il rischio di infiltrazioni e perdite di dati. È facile ignorare la questione e affermare che un server di sviluppo non ha bisogno di un alto livello di sicurezza. Tuttavia, la situazione è più complessa e ciò vale per tutti i server MongoDB. In particolare, se non ci sono motivi validi per utilizzare , o , è necessario disabilitare l'uso di codice arbitrario in JavaScript, modificando il file di configurazione . Poiché nei file di dati standard di MongoDB non è presente la crittografia, è ragionevole eseguire MongoDB con , che ha accesso completo ai file, con accesso limitato solo per lui e la possibilità di utilizzare i propri strumenti di gestione degli accessi ai file del sistema operativo.
Errore nella progettazione dello schema
MongoDB non utilizza uno schema. Ma questo non significa che uno schema non sia necessario. Se desideri semplicemente memorizzare documenti senza uno schema coerente, puoi farlo in modo rapido e semplice, ma estrarli poi può essere .
L'articolo classico " merita di essere letto, così come funzionalità come Nello strumento esterno Studio 3T, è utile eseguire controlli regolari sullo schema.
Non dimenticare l'ordine di ordinamento
Dimenticare l'ordine di ordinamento può portare alla massima frustrazione e farti perdere più tempo rispetto all'utilizzo di qualsiasi altra configurazione errata. Per impostazione predefinita, MongoDB utilizza . Ma difficilmente sarà utile a qualcuno. Gli ordinamenti sensibili al maiuscolo, agli accenti e binari sono stati considerati curiosi anacronismi, accanto a perline, kaftani e baffi arricciati negli anni '80 dello scorso secolo. Ora, il loro utilizzo è inaccettabile. Nella vita reale, "moto" è lo stesso di "Moto". E "Gran Bretagna" e "gran bretagna" si riferiscono allo stesso posto. La lettera minuscola è semplicemente l'equivalente maiuscolo. E non farmi parlare dell'ordinamento dei caratteri diacritici. Quando crei un database in MongoDB, utilizza parametri di ordinamento che non tengano conto degli accenti e , che corrispondono alla lingua e . In questo modo semplifichi notevolmente la ricerca nei dati testuali.
Creazione di collezioni con documenti di grandi dimensioni
MongoDB è felice di ospitare documenti di grandi dimensioni fino a 16 MB nelle collezioni, ma è progettata per documenti che superano i 16 MB. Tuttavia, solo perché è possibile ospitare grandi documenti lì, non è l'idea migliore conservarli in quel modo. MongoDB funziona al meglio se si salvano documenti separati di dimensioni in kilobyte, trattandoli più come righe in una tabella SQL ampia. I documenti di grandi dimensioni possono causare problemi di .
Creare documenti con grandi array
I documenti possono contenere array. È meglio se il numero di elementi nell'array è lontano da un numero a quattro cifre. Se gli elementi vengono aggiunti frequentemente all'array, esso supererà il documento che lo contiene e dovrà essere , il che significa che dovranno essere . Durante la reindicizzazione di un documento con un grande array, gli indici spesso vengono riscritti, poiché esiste una , che memorizza il suo indice. Questa reindicizzazione avviene anche quando un documento viene inserito o rimosso.
In MongoDB esiste quello che viene chiamato il , che fornisce spazio per la crescita dei documenti, per ridurre al minimo questo problema.
Potresti pensare di poter fare a meno dell'indicizzazione degli array. Purtroppo, l'assenza di indici può portare ad altri problemi. Poiché i documenti vengono visualizzati dall'inizio alla fine, la ricerca di elementi alla fine dell'array richiederà più tempo, e la maggior parte delle operazioni associate a tale documento risulterà .
Ricorda che l'ordine delle fasi nell'aggregazione è importante.
In un sistema di database con un ottimizzatore delle query, le query che scrivi sono spiegazioni di ciò che desideri ottenere, non di come ottenerlo. Funziona in modo simile a un ordine al ristorante: di solito ordini semplicemente un piatto, senza dare istruzioni dettagliate allo chef.
In MongoDB dai istruzioni allo chef. Ad esempio, devi assicurarti che i dati passino attraverso reduce il prima possibile nel pipeline utilizzando $match e $project, mentre l'ordinamento avviene solo dopo reduce, e che la ricerca avviene esattamente nell'ordine di cui hai bisogno. Avere un ottimizzatore di query che elimina il lavoro superfluo, ordina in modo ottimale le fasi e seleziona il tipo di connessione, può viziarti. In MongoDB hai maggiore controllo a scapito della comodità.
Strumenti come semplificheranno la costruzione di query di aggregazione in . La funzione Aggregation Editor ti permetterà di applicare gli operatori di pipeline uno stadio alla volta, nonché di controllare i dati di input e output in ogni fase per semplificare il debug.
Utilizzo della scrittura rapida
Non impostare mai in MongoDB parametri di scrittura ad alta velocità, ma con bassa affidabilità. Questa modalità «file-and-forget» sembra veloce, poiché il comando restituisce prima che avvenga la scrittura. Se il sistema si arresta prima che i dati vengano scritti su disco, andranno persi e si troveranno in uno stato incoerente. Fortunatamente, nel MongoDB a 64 bit è attivato il logging.
I motori di archiviazione MMAPv1 e WiredTiger utilizzano il logging per prevenire ciò, sebbene WiredTiger possa riprendersi fino all'ultimo , se la registrazione è disabilitata.
La registrazione garantisce che il database rimanga in uno stato coerente dopo il recupero e conserva tutti i dati fino al momento della registrazione. La frequenza delle registrazioni può essere configurata tramite l'opzione .
Per essere certi delle registrazioni, assicurati che nel file di configurazione la registrazione sia attivata ), e che la frequenza delle registrazioni corrisponda alla quantità di informazioni che puoi permetterti di perdere.
Ordinamento senza indice
Durante la ricerca e l'aggregazione, spesso sorge la necessità di ordinare i dati. Speriamo che ciò avvenga in uno degli ultimi passaggi, dopo aver filtrato i risultati per ridurre la quantità di dati da ordinare. Anche in tal caso, avrai bisogno di . Puoi utilizzare un indice singolo o composito.
Se non è disponibile un indice adeguato, MongoDB procederà senza uno. Esiste un limite di memoria di 32 MB sulla dimensione totale di tutti i documenti nella , e se MongoDB raggiunge questo limite, restituirà un errore oppure .
Ricerca senza supporto per indici
Le query di ricerca svolgono una funzione simile all'operazione JOIN in SQL. Per una migliore funzionalità, necessitano di un indice del valore della chiave utilizzato come chiave esterna. Questo non è ovvio, poiché l'uso non è riflesso in explain(). Questi indici sono un complemento all'indice registrato in explain(), che a sua volta è utilizzato dagli operatori di pipeline $match e $sort, quando si trovano all'inizio della pipeline. Gli indici ora possono coprire qualsiasi fase .
L'abbandono dell'uso dei multi-update
Metodo è utilizzato per modificare parte di un documento esistente o l'intero documento, fino alla sostituzione completa a seconda del parametro specificato. Non è così ovvio che non elaborerà tutti i documenti nella collezione, a meno che non impostiate il parametro per aggiornare tutti i documenti che soddisfano i criteri di ricerca.
Non dimenticate l'importanza dell'ordine delle chiavi nella hash table.
In JSON, un oggetto consiste in una collezione non ordinata di zero o più coppie chiave/valore, dove la chiave è una stringa e il valore è una stringa, un numero, un valore booleano, zero, un oggetto o un array.
Purtroppo, BSON attribuisce grande importanza all'ordine nella ricerca. In MongoDB, l'ordine delle chiavi all'interno degli oggetti incorporati , cioè. { firstname: "Phil", surname: "factor" } – non è la stessa cosa di { { surname: "factor", firstname: "Phil" }. Cioè, devi mantenere negli documenti l'ordine delle coppie chiave/valore se vuoi essere sicuro di trovarle.
Non confondere «null» e «undefined»
Significato «undefined» non è mai stato valido in JSON, secondo JSON (ECMA-404, Sezione 5), anche se viene utilizzato in JavaScript. Inoltre, per BSON è obsoleto e viene convertito in $null, che non è sempre una buona soluzione. .
L'utilizzo di $limit() di $sort()
Spesso, quando sviluppi in MongoDB, è utile vedere semplicemente un esempio del risultato che verrà restituito dalla query o dall'aggregazione. Per questo compito, ti sarà utile $limit(), ma non dovrebbe mai essere presente nella versione finale del codice, a meno che non venga utilizzato prima di esso. $sort. Questa meccanica è necessaria, poiché altrimenti non puoi garantire l'ordine dei risultati e non potrai visualizzare i dati in modo affidabile. Nella parte superiore dei risultati, otterrai voci diverse a seconda dell'ordinamento. Per un funzionamento affidabile, le query e le aggregazioni devono essere determinate, cioè devono restituire risultati identici a ogni esecuzione. Il codice che presenta $limit(), ma non $sort, non sarà considerato determinato e potrebbe successivamente causare errori difficili da rintracciare.
Conclusione
L'unico modo per frustrarsi con MongoDB è confrontarlo direttamente con un altro tipo di database, come i DBMS, o avvicinarsi al suo utilizzo con aspettative specifiche. È come paragonare un'arancia a una forchetta. I sistemi di database hanno obiettivi specifici. È meglio comprendere e valutare queste differenze per conto proprio. Sarebbe un peccato mettere pressione agli sviluppatori di MongoDB per la strada che sono stati costretti a intraprendere nel mondo dei DBMS. Vorrei vedere nuovi e interessanti modi per affrontare vecchi problemi, come garantire l'integrità dei dati e creare sistemi di dati resilienti a guasti e attacchi malevoli.
L'introduzione della transazionalità ACID in MongoDB nella versione 4.0 è un buon esempio di come implementare importanti miglioramenti in modo innovativo. Le transazioni multi-documento e multi-operazione ora sono atomiche. È stata anche introdotta la capacità di regolare il tempo necessario per acquisire i lock e terminare le transazioni bloccate, oltre a modificare il livello di isolamento.
Leggi di più:
Fonte: habr.com
