14 cose che avrei voluto sapere prima di iniziare a lavorare con MongoDB

La traduzione dell'articolo è stata preparata in vista dell'inizio del corso «Database non relazionali».

14 cose che avrei voluto sapere prima di iniziare a lavorare con MongoDB

Punti principali:

  • È estremamente importante sviluppare uno schema nonostante in MongoDB sia facoltativo.
  • Analogamente, gli indici dovrebbero corrispondere al tuo schema e ai modelli di accesso.
  • Evita di utilizzare oggetti grandi e array molto ampi.
  • Fai attenzione alle impostazioni di MongoDB, soprattutto quando si tratta di sicurezza e affidabilità.
  • In MongoDB non esiste un ottimizzatore di query, quindi devi fare attenzione quando esegui operazioni di query.

Lavoro da molto tempo con i database, ma ho scoperto MongoDB solo recentemente. Ci sono alcune cose che avrei voluto sapere prima di iniziare a lavorare con esso. Quando una persona ha già esperienza in un certo campo, ha preconcetti su cosa siano i database e cosa facciano. Nella speranza di facilitare la comprensione ad altre persone, presento un elenco di errori comuni.

Creare un server MongoDB senza autenticazione

Sfortunatamente, MongoDB viene installato senza autenticazione di default. Per una workstation a cui si accede localmente, questa pratica è normale. Ma poiché MongoDB è un sistema multi-utente che tende a utilizzare grandi quantità di memoria, è meglio installarlo su un server con la massima quantità possibile di RAM secondo le tue condizioni, anche se intendi utilizzarlo solo per lo sviluppo. L'installazione su un server tramite la porta di default può presentare dei problemi, soprattutto se nella query può essere eseguito qualsiasi codice JavaScript (ad esempio, $where come idea per iniezione).

Esistono diversi metodi di autenticazione, ma il più semplice è impostare un ID/password per l'utente. Approfitta di questa idea mentre pensi a un'autenticazione più elaborata basata su LDAP. Parlando di sicurezza, MongoDB deve essere costantemente aggiornato e i log devono sempre essere controllati per rilevare accessi non autorizzati. A me, ad esempio, piace scegliere una porta diversa come porta predefinita.

Non dimenticare di legare la superficie di attacco a MongoDB

Checklist di sicurezza per MongoDB contiene buoni consigli per ridurre il rischio di intrusioni nella rete e perdite di dati. È facile liquidare la questione e dire che un server per lo sviluppo non ha bisogno di un alto livello di sicurezza. Tuttavia, non è così semplice e questo vale per tutti i server MongoDB. In particolare, se non c'è una valida motivazione per utilizzare mappaRiduci, gruppo o $where, è necessario disabilitare l'uso di codice JavaScript arbitrario scrivendo nel file di configurazione javascriptEnabled:false. Poiché in MongoDB standard i file di dati non sono crittografati, è sensato eseguire MongoDB con Utente Dedicato, che ha accesso completo ai file, con accesso limitato solo per lui e la possibilità di utilizzare strumenti di gestione dell'accesso ai file del sistema operativo.

Errore nella progettazione dello schema

MongoDB non utilizza uno schema. Ma ciò non significa che uno schema non sia necessario. Se desideri semplicemente archiviare documenti senza uno schema coerente, puoi farlo in modo rapido e semplice, ma estrarli in seguito potrebbe risultare incredibilmente difficile.

L'articolo classico "6 regole empiriche per progettare schemi MongoDB" vale la pena leggerlo, e funzioni come Schema Explorer in uno strumento esterno come Studio 3T, dovrebbero essere utilizzate per controlli regolari sugli schemi.

Non dimenticare l'ordine di ordinamento

Dimenticarsi dell'ordinamento può causare le maggiori delusioni e farti perdere più tempo rispetto a qualsiasi altra configurazione errata. Per impostazione predefinita, MongoDB utilizza l'ordinamento binario. Ma è difficile che risulti utile. Le ordinazioni sensibili a maiuscole e minuscole, agli accenti e l'ordinamento binario sono stati considerati curiosi anacronismi insieme a perline, kaftani e baffi arricciati già negli anni '80. Ora, il loro utilizzo è imperdonabile. Nella vita reale, "moto" è la stessa cosa di "Moto". E "Britain" e "britain" sono lo stesso posto. Una lettera minuscola è semplicemente l'equivalente maiuscolo di una lettera maiuscola. E non farmi parlare dell'ordinamento dei segni diacritici. Quando crei un database in MongoDB, utilizza opzioni di ordinamento senza considerare gli accenti e il maiuscolo, che corrispondono alla lingua e cultura degli utenti del sistema. In questo modo semplificherai notevolmente la ricerca nei dati di tipo stringa.

Creazione di collezioni con documenti di grandi dimensioni

MongoDB è felice di ospitare grandi documenti fino a 16 MB nelle collezioni, mentre GridFS è progettata per grandi documenti oltre 16 MB. Tuttavia, il semplice fatto che sia possibile caricare grandi documenti lì non significa che sia l'idea migliore conservarli in quel modo. MongoDB funzionerà meglio se si salvano documenti separati di dimensioni nell'ordine di alcuni kilobyte, considerandoli più come righe in una tabella SQL ampia. I grandi documenti possono causare problemi di prestazioni.

La creazione di documenti con grandi array

I documenti possono contenere array. È meglio se il numero di elementi nell'array sia lontano da un numero di quattro cifre. Se gli elementi vengono aggiunti frequentemente all'array, esso supererà il documento che lo contiene e dovrà essere spostato, il che significa che dovrà essere aggiornato e anche gli indici. Durante la reindicizzazione di un documento con un grande array, gli indici vengono spesso sovrascritti, poiché per ogni elemento esiste una voce, che conserva il suo indice. Questa reindicizzazione si verifica anche quando un documento viene inserito o rimosso.

In MongoDB c'è quello che viene chiamato «tasso di riempimento», che offre spazio per la crescita dei documenti, per minimizzare questo problema.
Si potrebbe pensare di poter fare a meno della indicizzazione degli array. Sfortunatamente, a causa della mancanza di indici, potrebbero sorgere altri problemi. Poiché i documenti vengono esaminati dall'inizio alla fine, la ricerca di elementi alla fine dell'array richiederà più tempo e molte delle operazioni collegate a un documento del genere saranno lente.

Non dimenticate che l'ordine delle fasi nell'aggregazione è importante

In un sistema di database con ottimizzatore di query, le query che scrivete sono spiegazioni di ciò che volete ottenere, non di come ottenerlo. Funziona come un ordine al ristorante: di solito ordini semplicemente un piatto, senza dare istruzioni dettagliate al cuoco.

In MongoDB date istruzioni al cuoco. Ad esempio, è importante assicurarsi che i dati passino attraverso reduce il prima possibile nella pipeline usando $match e $project, e la ordinazione avviene solo in seguito reduce, e che la ricerca avvenga esattamente nell'ordine necessario. 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 un maggiore controllo a scapito della comodità.

Strumenti come Studio 3T semplificheranno la costruzione di query di aggregazione in MongoDB. La funzione Aggregation Editor ti permetterà di applicare gli operatori di pipeline uno stadio alla volta e di verificare i dati in ingresso e in uscita in ogni fase per semplificare il debug.

Uso della scrittura veloce

Non impostare mai in MongoDB parametri di scrittura ad alta velocità ma a bassa affidabilità. Questa modalità "file-and-forget" sembra veloce, poiché il comando restituisce prima che la scrittura sia completata. Se il sistema si arresta prima che i dati vengano scritti su disco, andranno persi e il sistema sarà incoerente. Fortunatamente, in MongoDB a 64 bit è abilitato il logging.

I motori di archiviazione MMAPv1 e WiredTiger utilizzano il logging per prevenire questo, anche se WiredTiger può ripristinarsi all'ultima punto di controllo, se il logging è disabilitato.

Il logging garantisce che il database sia in uno stato coerente dopo il ripristino e mantiene tutti i dati fino al momento della registrazione nel log. La frequenza delle scritture è configurabile tramite il parametro intervalloDiImpegnoMs.

Per essere sicuri delle scritture, assicurati che nel file di configurazione il logging sia abilitato (storage.journal.abilitato), e che la frequenza delle scritture corrisponda a quanto vuoi permetterti di perdere.

Ordinamento senza indice

Quando cerchi e aggregati, spesso è necessario ordinare i dati. Speriamo che questo venga fatto in una delle fasi finali, dopo aver filtrato il risultato per ridurre il volume dei dati ordinati. E anche in tal caso, avrai bisogno di un indice. Puoi utilizzare un indice singolo o composto.

Se non esiste un indice appropriato, MongoDB potrà farne a meno. Esiste un limite di memoria di 32 MB sulla dimensione totale di tutti i documenti in operazione di ordinamento, e se MongoDB raggiunge questo limite, restituirà un errore o un insieme di risultati vuoto.

Ricerca senza supporto degli indici

Le query di ricerca svolgono una funzione analoga all'operazione JOIN in SQL. Per funzionare al meglio hanno bisogno 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 supplemento all'indice registrato in explain(), che a sua volta è utilizzato dagli operatori di pipeline $match e $sort, quando questi si presentano all'inizio della pipeline. Gli indici ora possono coprire qualsiasi fase della pipeline di aggregazione.

La rinuncia all'uso delle multi-aggiornamenti

Sanitizer.replaceElementWithChildren() db.collection.update() è utilizzata per modificare una parte di un documento esistente o un intero documento, fino a una sostituzione completa a seconda del parametro da te specificato aggiornamento. Non è così ovvio che non processerà tutti i documenti nella collezione finché non imposti il parametro multiplo per aggiornare tutti i documenti che soddisfano i criteri della query.

Non dimenticare l'importanza dell'ordine delle chiavi nella tabella hash

In JSON, un oggetto è composto da una collezione non ordinata di zero o più coppie nome/valore, dove il nome è una stringa e il valore può essere una stringa, un numero, un valore booleano, zero, un oggetto o un array.

Sfortunatamente, BSON attribuisce grande importanza all'ordine durante la ricerca. In MongoDB, l'ordine delle chiavi all'interno degli oggetti incorporati ha importanza, cioè. { firstname: "Phil", surname: "factor" } – non è la stessa cosa di { { surname: "factor", firstname: "Phil" }. Quindi devi mantenere nei documenti l'ordine delle coppie nome/valore se desideri essere certo di trovarle.

Non confondere "null" e "undefined"

Valore "undefined" non è mai stato valido in JSON, secondo lo standard ufficiale JSON (ECMA-404, Sezione 5), nonostante venga utilizzato in JavaScript. Inoltre, per BSON è deprecato e viene convertito in $null, il che non è sempre una buona soluzione. Evita di usare "undefined" in MongoDB.

Utilizzo $limit() senza $sort()

Molto spesso, quando sviluppi in MongoDB, è utile vedere semplicemente un campione del risultato che verrà restituito dalla query o dall'aggregazione. Per questa attività ti sarà utile $limit(), ma non dovrebbe mai essere presente nella versione finale del codice, a meno che tu non lo utilizzi prima $sort. Questa meccanica è necessaria, poiché altrimenti non puoi garantire l'ordine dei risultati e non sarai in grado di visualizzare i dati in modo affidabile. Nella parte superiore del risultato riceverai diverse voci a seconda dell'ordinamento. Per un funzionamento affidabile, le query e le aggregazioni devono essere determinate, cioè devono restituire risultati identici ad ogni esecuzione. Il codice che contiene $limit(), ma non contiene $sort, non sarà deterministico e potrebbe successivamente causare errori che saranno difficili da rintracciare.

Conclusione

L'unico modo per rimanere delusi da MongoDB è confrontarlo direttamente con un altro tipo di database, come un RDBMS, o avvicinarsi al suo utilizzo con particolari aspettative. È come confrontare un'arancia con una forchetta. I sistemi di database mirano a obiettivi specifici. È meglio semplicemente comprendere e valutare queste differenze. Sarebbe un peccato esercitare pressione sugli sviluppatori di MongoDB a causa del percorso che li ha costretti ad andare verso un RDBMS. Voglio vedere modi nuovi e interessanti per risolvere vecchi problemi come garantire l'integrità dei dati e creare sistemi di dati resilienti ai guasti e agli attacchi degli hacker.

L'implementazione di transazionalità ACID in MongoDB nella versione 4.0 è un buon esempio di implementazione di miglioramenti significativi in modo innovativo. Le transazioni multi-documento e multi-operatore sono ora atomiche. È anche possibile regolare il tempo necessario per ottenere i blocchi e terminare le transazioni bloccate, oltre a modificare il livello di isolamento.

14 cose che avrei voluto sapere prima di iniziare a lavorare con MongoDB

Leggi anche:

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster