Vai al contenuto principale

MongoDB find(): guida completa per principianti alle query sui dati

Questa guida spiega come usare il metodo find() di MongoDB per interrogare, filtrare, ordinare e paginare i dati con esempi reali. Perfetta per principianti e per chi passa da SQL.
Aggiornato 29 set 2026  · 9 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

MongoDB è un popolare database NoSQL progettato per flessibilità e prestazioni. A differenza dei database relazionali tradizionali, che usano tabelle strutturate e SQL, MongoDB archivia i dati in documenti flessibili simili a JSON. Questo lo rende ideale per gli sviluppatori che lavorano con dati dinamici o semi-strutturati.

Una delle operazioni più importanti che eseguirai in MongoDB è la creazione di query sui dati, e il metodo più usato per farlo è find(). Che tu stia iniziando ora o voglia migliorare le tue abilità di interrogazione, capire come funziona find() è essenziale per navigare e manipolare efficacemente i dati in MongoDB.

Immagina di esplorare un database di film. Vuoi trovare tutti i film di fantascienza usciti dopo il 2000, oppure elencare tutti i commenti degli utenti fatti in un determinato intervallo di tempo. È qui che find() dà il meglio.

In questo articolo imparerai a usare il metodo find() per recuperare documenti da una collezione, applicare filtri, proiettare campi, ordinare i risultati e ottimizzare le prestazioni, il tutto lavorando con il dataset sample_mflix.

Per un percorso pratico sull'uso di MongoDB nei workflow di data science, dai un'occhiata al corso Introduction to MongoDB in Python.

Introduzione a find() in MongoDB

Il metodo find() è il modo principale in cui MongoDB recupera documenti da una collezione. Restituisce un cursore sui documenti che corrispondono alla query specificata. Puoi quindi iterare su questo cursore o convertirlo in un array, a seconda delle esigenze della tua applicazione.

Ecco la sintassi completa:

db.collection.find(<query>, <projection>, <options>)

Parametri

  • query (opzionale): un documento che definisce i criteri per selezionare i documenti. Se ometti questo parametro o passi un documento vuoto ({}), find() restituirà tutti i documenti nella collezione.
  • projection (opzionale): un documento che specifica quali campi restituire. Puoi includere (1) o escludere (0) campi. Per impostazione predefinita, MongoDB restituisce tutti i campi, incluso _id.
  • options (opzionale): un documento aggiuntivo per configurare il comportamento della query. Puoi impostare elementi come ordine di ordinamento, limiti di paginazione, timeout e suggerimenti sugli indici.

Esempio

Per rendere i concetti il più chiari e applicabili possibile, useremo il dataset di esempio di MongoDB Atlas—in particolare il database sample_mflix. Questo dataset include collezioni come film, commenti, utenti e sale cinematografiche, che citeremo in tutto l'articolo per dimostrare ogni esempio.

db.books.find(
  { year: { $gte: 2000 } },              // query: books published in or after 2000
  { title: 1, author: 1, _id: 0 },        // projection: include only title and author
  { sort: { title: 1 }, limit: 5 }       // options: sort by title, return only 5 books
)

Questa query:

  • Filtra i libri pubblicati nel 2000 o successivamente.
  • Restituisce solo i campi titolo e autore (esclude _id).
  • Ordina i risultati alfabeticamente per titolo (A-Z).
  • Limita l'output ai primi cinque libri corrispondenti.

Questa query trova i film usciti dopo il 2000, ordinati per titolo e limitati a cinque risultati.

Figura 1. Questa query trova i film usciti dopo il 2000, ordinati per titolo e limitati a cinque risultati.

Il risultato è un cursore, che carica pigramente i documenti corrispondenti man mano che ci iteri sopra. Puoi usare .toArray() o .forEach() per elaborare i risultati.

Se sei connesso tramite la shell di MongoDB (mongosh) e non assegni il risultato a una variabile, per impostazione predefinita verranno mostrati solo i primi 20 documenti. Per visualizzare documenti aggiuntivi, digita it e premi Invio. Questo processo continuerà recuperando il batch successivo dal cursore.

> Nota: quanto sopra è un comportamento specifico della shell, non un limite di MongoDB. Nella maggior parte dei driver MongoDB (ad es. Node.js, Python, Java), chiamare .toArray() o iterare sul cursore recupera automaticamente tutti i risultati corrispondenti. Il comportamento del cursore può variare a seconda dell'ambiente e del linguaggio che stai usando.

Questa query recupera tutti i film, restituendo solo il campo _id e usando il cursore per ottenere risultati aggiuntivi.

Figura 2. Questa query recupera tutti i film, restituendo solo il campo _id e usando il cursore per ottenere risultati aggiuntivi.

Se sei alle prime armi con i database NoSQL, il corso Introduction to NoSQL offre i concetti di base che completano questo tutorial.

Scrivere le tue prime query

Proseguendo con l'esempio dei film, poniamo che tu voglia recuperare tutti i film del genere Sci-Fi. Ecco come farlo:

db.movies.find({ genres: "Sci-Fi" })

Ora vuoi solo i film usciti nel 2000 o successivamente:

db.movies.find({ year: { $gte: 2000 } })

E se li vuoi entrambi? Combina le condizioni:

db.movies.find({ genres: "Sci-Fi", year: { $gte: 2000 } })

In alternativa, puoi scriverlo esplicitamente usando $and:

db.movies.find({ $and: [ { genres: "Sci-Fi" }, { year: { $gte: 2000 } } ] })

Entrambe le query restituiscono lo stesso risultato—documenti con genere Sci-Fi e anno di uscita 2000 o successivo. La prima forma è più concisa ed è preferibile quando i campi sono diversi.

Modi diversi di scrivere la query che producono lo stesso risultato.

Figura 3. Modi diversi di scrivere la query che producono lo stesso risultato.

Usa find() come un imbuto di filtraggio—ogni condizione restringe i risultati.

Uso di operatori di confronto e logici

Ora rivediamo come usare gli operatori di confronto e logici per portare le tue query al livello successivo.

Operatori di confronto

  • $eq, $ne: uguale, diverso
  • $gt, $gte, $lt, $lte: maggiore/minore (o uguale)
  • $in, $nin: presente o non presente in un array

Immagina di tracciare gli ordini dei clienti e voler gli ordini tra 100 $ e 500 $:

db.orders.find({ total: { $gte: 100, $lte: 500 } })

Operatori logici

  • $and, $or, $nor, $not

Ora, immagina di voler mostrare i prodotti nella categoria "Books" oppure con prezzo inferiore a 20 $. Ecco un esempio di query:

db.products.find({ $or: [ { category: "Books" }, { price: { $lt: 20 } } ] })

Query su campi annidati

Puoi accedere ai campi annidati usando la dot notation:

db.customers.find({ "address.city": "Chicago" })

Proiettare i campi

La proiezione ti permette di restituire solo ciò che ti serve, il che può migliorare sensibilmente prestazioni e chiarezza.

db.movies.find({}, { directors: 1, languages: 1, _id: 0 })

Importante: quando specifichi una proiezione, MongoDB richiede di scegliere tra due modalità: includere campi specifici (1) oppure escludere campi specifici (0). Non puoi mescolare entrambi gli stili nella stessa proiezione, fatta eccezione per il campo _id, che può essere escluso anche quando altri campi sono inclusi.

✅ Valido (solo inclusione):

db.movies.find({}, { directors: 1, languages: 1 })

✅ Valido (solo esclusione):

db.movies.find({}, { directors: 0, _id: 0 })

❌ Non valido (mix di inclusione ed esclusione):

db.movies.find({}, { directors: 1, languages: 0 }) // Not allowed

L'unica eccezione è il campo _id, che puoi escludere anche quando includi altri campi:

db.movies.find({}, { directors: 1, _id: 0 }) // Allowed

Questo esempio mostra l'errore generato dal mix di inclusione ed esclusione di campi in un'unica proiezione, cosa non consentita da MongoDB, tranne che per _id.

Figura 4. Questo esempio mostra l'errore generato dal mix di inclusione ed esclusione di campi in un'unica proiezione, non consentito da MongoDB, tranne che per `_id`.

Ordinare, limitare e saltare risultati

Quando lavori con dataset di grandi dimensioni, è comune mostrare agli utenti solo una parte dei dati alla volta—una tecnica nota come paginazione. Ad esempio, un'app di streaming potrebbe mostrare 10 film per pagina invece di caricarne migliaia in una volta. Questo non solo migliora le prestazioni ma anche l'esperienza utente.

In MongoDB, la paginazione si ottiene combinando sort(), limit() e skip().

SQL vs. MongoDB: confronto di base

Se arrivi da un background SQL, ecco come si confrontano i concetti comuni di paginazione:

Query di base in SQL: 

SELECT * FROM movies WHERE year >= 2000

Lo stesso può essere espresso in MongoDB come segue:

db.movies.find({ year: { $gte: 2000 } })

Selezione di campi in SQL: 

SELECT title, year FROM movies

Selezione di campi in MongoDB: 

db.movies.find({}, { title: 1, year: 1, _id: 0 })

Ora vediamo qualche altro esempio di operazioni comuni sulle query:

Ordinamento:

  • SQL: ORDER BY title ASC
  • MongoDB: .sort({ title: 1 })

Limitazione:

  • SQL: LIMIT 10
  • MongoDB: .limit(10)

Salto:

  • SQL: OFFSET 10
  • MongoDB: .skip(10)

Capire questi parallelismi può aiutare gli utenti SQL a passare più facilmente al sistema di query basato su documenti di MongoDB.

Ordinare i risultati

L'ordinamento ti aiuta a organizzare i risultati in base a un campo specifico—ad esempio, per ordinare i film per titolo in ordine alfabetico:

db.movies.find().sort({ title: 1 }) // ascending (A–Z)
  • 1 significa ordine crescente (A-Z, 0-9)
  • -1 significa ordine decrescente (Z-A, 9-0)

Limitare i risultati

Restituisci solo un certo numero di risultati—ad esempio, i primi 10:

db.movies.find().limit(10)

Questo è utile quando implementi elenchi "Top 10" o viste iniziali.

Saltare i risultati

Usalo per saltare documenti. Spesso è usato insieme a limit() per la paginazione:

db.movies.find().skip(10).limit(10)

Questo salta i primi 10 documenti e restituisce i successivi 10, mostrando di fatto la Pagina 2 quando pageSize = 10.

Formula di paginazione:

skip = (pageNumber - 1) * pageSize

> Nota: usare skip() per paginazione profonda (ad es., skip(10000)) può essere inefficiente, perché MongoDB scansiona comunque e scarta i documenti saltati. Per prestazioni migliori con grandi dataset, valuta la paginazione basata su intervalli usando campi indicizzati come _id.

Esempio combinato: Pagina 3, 10 film per pagina, ordinati per titolo

db.movies.find()
  .sort({ title: 1 })
  .skip(20)
  .limit(10)

Questo schema è utile anche per funzionalità come "carica altro" o lo scroll infinito.

Questa query recupera la terza pagina di risultati (10 film per pagina), ordinata per titolo.

Figura 5. Questa query recupera la terza pagina di risultati (10 film per pagina), ordinata per titolo.

Lavorare con i cursori

Il metodo find() restituisce un cursore—un puntatore al set di risultati. Puoi iterarci sopra:

const cursor = db.movies.find({ type: "movie" });
cursor.forEach(doc => print(doc.name));

Oppure convertirlo in un array:

const results = db.collection.find().toArray();

Dopo aver chiamato find(), ricevi un cursore. Puoi usarlo per iterare sui documenti o convertire l'intero set di risultati in un array.

Figura 6. Dopo aver chiamato `find()`, ricevi un cursore. Puoi usarlo per iterare sui documenti o convertire l'intero set di risultati in un array.

> Nota: l'oggetto cursore è disponibile in mongosh o nel codice tramite i driver (ad es., Node.js, Python). Gli strumenti GUI come MongoDB Compass gestiscono internamente i cursori. Non li accederai né ci itererai direttamente.

Opzioni avanzate del cursore

Per affinare le tue query, puoi usare metodi aggiuntivi del cursore:

db.users.find({ age: { $gte: 30 } })
  .sort({ name: 1 })
  .limit(10)
  .skip(5)
  .maxTimeMS(200)
  .hint({ age: 1 })
  • maxTimeMS(ms): interrompe la query se impiega troppo tempo
  • hint(): forza MongoDB a usare un indice specifico
  • batchSize(n): controlla il numero di documenti per batch

Ti stai preparando ai colloqui? Esplora le 25 principali domande e risposte su MongoDB per mettere alla prova la tua comprensione di concetti chiave come find().

Indici e ottimizzazione delle prestazioni

Gli indici sono come scorciatoie—aiutano MongoDB a recuperare i documenti più velocemente.

Creare un indice

db.movies.createIndex({ type: 1 })

Usare .explain()

db.users.find({ type: "movie" }).explain()

Questo rivela se gli indici vengono usati e quanto è efficiente la tua query.

Senza un indice: Esegui explain() sulla query prima di creare l'indice.

Figura 7. Esegui `explain()` sulla query prima dell'indicizzazione.

Creazione di un indice: 

Crea un indice semplice sul campo type.

Figura 8. Crea un indice semplice sul campo type.

Con un indice: 

Esegui la stessa query con explain(), ora usando un indice.

Figura 9. Esegui la stessa query con `explain()`, ora usando un indice.

Puoi vedere che lo stage che prima era CollScan (scansione della collezione) è diventato Fetch + IXSCAN, ossia utilizza l'indice + cerca altri dati che non fanno parte dell'indice (dato che stiamo restituendo tutto).

Usare MongoDB Compass per visualizzare le query

Se preferisci strumenti visuali, MongoDB Compass è il client GUI ufficiale. Ti consente di:

  • Costruire visivamente le query usando i filtri.
  • Visualizzare in anteprima documenti e indici.
  • Ottimizzare e convalidare le prestazioni delle query.

Puoi anche passare alla "vista JSON" per copiare/incollare le query nel tuo codice.

Usare Atlas + AI per generare query

Se usi MongoDB Atlas, puoi sfruttare Atlas Search con il generatore di query potenziato dall'AI.

Ti basta scrivere un prompt in linguaggio naturale come:

"Mostrami tutti i clienti del Brasile che hanno effettuato ordini superiori a 100 $ nell'ultimo mese."

Atlas suggerisce una query MongoDB corrispondente usando find() o $search. È un ottimo acceleratore di produttività, soprattutto quando non sei sicuro della sintassi.

Usa Compass per generare una query dal linguaggio naturale.

Figura 10. Usa Compass per generare una query dal linguaggio naturale.

Errori comuni e come evitarli

  • Query su campi non indicizzati → Portano a prestazioni lente
  • Set di risultati molto grandi → Usa la paginazione (limit + skip)
  • Proiezioni inefficienti → Proietta sempre solo i campi necessari
  • Incongruenze di tipo → Assicurati che i tipi dei campi corrispondano (ad es., numero vs stringa)
  • Mescolare inclusione ed esclusione nelle proiezioni → Non consentito, tranne per _id

Confrontare MongoDB find() con SQL

Se arrivi da un background SQL, capire come find() di MongoDB si confronta con le query SQL familiari può semplificare la transizione. Ecco un confronto generale delle operazioni comuni:

Concetto

Esempio SQL

Equivalente MongoDB

Query di base

SELECT * FROM users WHERE age >= 18

db.users.find({ age: { $gte: 18 } })

Selezione campi

SELECT name, email FROM users

db.users.find({}, { name: 1, email: 1, _id: 0 })

Ordinamento

ORDER BY created_at DESC

.sort({ createdAt: -1 })

Limitazione

LIMIT 10

.limit(10)

Salto

OFFSET 10

.skip(10)

Come vedi, la sintassi di MongoDB è più simile a JavaScript ed espressiva in formato JSON, mentre SQL è più dichiarativo e strutturato. Conoscere questi parallelismi ti aiuterà a sentirti a tuo agio più rapidamente in MongoDB.

Riepilogo e best practice

  • Pensa a find() come al tuo filtro sui dati—combina condizioni per risultati precisi.
  • Proietta sempre solo i campi necessari per chiarezza e prestazioni.
  • Usa gli indici per evitare scansioni lente.
  • Usa Compass se preferisci un feedback visivo e iterazioni più rapide.
  • Sfrutta l'assistente AI di MongoDB Atlas per generare query più velocemente.
  • Esplora le opzioni avanzate del cursore per un controllo fine dei risultati.

Che tu stia costruendo una dashboard per startup, uno strumento di analisi dati o un back-end e-commerce, padroneggiare find() renderà la tua esperienza con MongoDB più fluida, veloce ed efficace.

Resta sintonizzato per altri approfondimenti su MongoDB nei prossimi articoli!

Vuoi convalidare le tue competenze su MongoDB? Leggi la guida completa alla certificazione MongoDB per esplorare le tue opzioni.

FAQ

In pratica, cos'è un cursore? Perché find() non mi restituisce semplicemente un array di risultati?

MongoDB restituisce un cursore, che carica i documenti in batch (lazy loading). Questo è efficiente per collezioni grandi ma può confondere i principianti che si aspettano un array.

Perché find() ha tre parametri, ma di solito ne vedo solo due? Perché il terzo argomento (options) compare raramente negli esempi?

Perché la maggior parte degli sviluppatori usa metodi concatenati come .sort(), .limit() e .skip() invece di passarli nell'oggetto options. Alcune funzionalità (ad es., hint, readConcern, collation) richiedono l'uso del documento delle opzioni o chiamate di metodi separati.

Perché find() non usa l'indice che ho creato? Ho creato un indice, ma la mia query find() è ancora lenta.

Non tutte le query usano automaticamente gli indici. L'ordine dei campi, i tipi di dato e le impostazioni di collation possono influenzare l'uso degli indici. Usa .explain("executionStats") per verificare se MongoDB sta usando un indice (IXSCAN) o facendo una scansione completa (COLLSCAN).

La mia proiezione migliora davvero le prestazioni? Sto proiettando solo due campi, ma non sembra più veloce.

Se i campi proiettati non sono in un indice, MongoDB deve comunque recuperare il documento completo dal disco. Usa indici "covering" per servire l'intera query dall'indice, evitando i lookup dei documenti.

Posso usare find() per raggruppare o riassumere i dati? Posso contare quanti film sono usciti ogni anno usando find()?

No. find() serve per recuperare documenti. Per raggruppare o riassumere, usa l'Aggregation Framework ($group, $count, ecc.). Anche se find() + .countDocuments() gestisce conteggi basilari, per esigenze analitiche reali usa .aggregate().

Qual è la differenza tra find() e findOne() in MongoDB?

 find() restituisce un cursore su tutti i documenti corrispondenti, mentre indOne() restituisce direttamente il primo documento corrispondente. Usa findOne() quando ti serve solo un singolo risultato.

Come interrogo un campo array usando find() in MongoDB?

Puoi far combaciare direttamente gli elementi di un array. Ad esempio, { tags: "tech" } corrisponde se "tech" è presente nell'array tags. Usa $elemMatch per condizioni più complesse.

Posso usare le espressioni regolari nelle query find() di MongoDB?

Sì, MongoDB supporta pattern regex usando una sintassi come { title: /sci-fi/i } per eseguire matching di pattern case-insensitive sulle stringhe.

Come uso find() con un intervallo di date in MongoDB?

Usa oggetti ISODate nella query. Ad esempio: { createdAt: { $gte: ISODate("2024-01-01"), $lte: ISODate("2024-12-31") } }.

Qual è l'impatto sulle prestazioni dell'uso di find() senza un indice?

Le query su campi non indicizzati attivano scansioni complete della collezione, che sono lente su dataset grandi. Indicizza sempre i campi interrogati frequentemente.


Samuel Molling's photo
Author
Samuel Molling
LinkedIn

Samuel Molling è un ingegnere dell'affidabilità dei database, appassionato di automazione e scalabilità di infrastrutture dati sicure nel cloud.

Argomenti
MongoDB
Data Engineering

Approfondisci MongoDB e i database con questi corsi!

Corso

Introduzione a MongoDB in Python

3 ore
24.4K
Impara a gestire e analizzare dati strutturati in modo flessibile con MongoDB.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro