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

La funzione javascript lato server ha problemi di prestazioni in mongoDB?

Quando chiedi informazioni sulla fattibilità di javascript lato server, devi prima chiarire di che tipo di javascript lato server stai parlando. Secondo la documentazione , esistono quattro diversi tipi di esecuzione di codice lato server. Sfortunatamente sono tutte soluzioni alternative per hackerare le situazioni in cui l'API nativa è insufficiente:

Il eval comando

eval ha lo svantaggio di funzionare solo su un nodo. Ciò riduce notevolmente la sua utilità in un ambiente cluster. Con le raccolte partizionate, non funziona affatto!

Per impostazione predefinita, crea anche un blocco globale che rende il database completamente inutilizzabile fino all'esecuzione dello script. Questo può essere evitato con il nolock argomento (a meno che lo script stesso non faccia qualcosa che crea un blocco globale).

La risposta di Sammaye spiega anche alcuni seri problemi di sicurezza.

È davvero più uno strumento di test e amministrazione che qualcosa che dovresti usare per qualsiasi operazione normale.

Esecuzione di file .js tramite un'istanza mongo shell sul server

In questo caso, il codice non viene eseguito sul database, ma su un altro processo indipendente su uno dei server. Ciò significa che tutti i dati richiesti da altri shard devono essere trasferiti al server che esegue il codice javascript, indipendentemente da ciò che viene effettivamente restituito dallo script.

Appare come un'altra applicazione sul server mongodb, quindi non può fare nulla che tu non possa fare anche dalla tua normale applicazione. È un altro strumento di test e amministrazione che non dovresti usare durante il normale funzionamento.

Trova con $where -operatore

L'operatore $where in un comando trova consente di passare una funzione javascript che viene utilizzata per filtrare i valori. Per la maggior parte dei casi banali, questo è molto meno performante di quello che hanno da offrire gli altri strumenti della query di ricerca, soprattutto perché non può utilizzare alcun indice.

Quando l'uso di $where non può essere evitato, almeno prova a utilizzare alcuni dei normali strumenti della query di ricerca per ridurre l'insieme di documenti che devono essere passati alla funzione $where.

MapReduce

MapReduce utilizza due funzioni javascript per creare dati aggregati. Era lo strumento di data mining principale per MongoDB, ma la maggior parte dei suoi casi d'uso usuali ora sono soddisfatte dal molto più intuitivo framework di aggregazione .

Ha anche lo stesso inconveniente di $dove:a meno che non filtri, dovrai eseguire non una ma almeno due funzioni javascript per ogni documento.

Ma MapReduce può almeno essere eseguito distribuito e può essere parallelizzato.

tl;dr:

L'uso di Javascript è una misura di ultima istanza per query molto insolite che non possono essere eseguite con il normale linguaggio di query e che richiedono l'accesso a troppi dati per essere implementate nell'applicazione. Quando possibile, fai quello che vuoi fare con gli strumenti specializzati che hai a disposizione o implementa la tua logica sul livello dell'applicazione.