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

Come restituire documenti in cui due campi hanno lo stesso valore

Hai due opzioni qui. Il primo consiste nell'usare $where operatore.

Collection.find( { $where: "this.start === this.end" } )

La seconda opzione consiste nell'utilizzare il framework di aggregazione e $redact operatore.

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

Il $where l'operatore esegue una valutazione JavaScript e non può sfruttare gli indici, quindi interroga utilizzando $where può causare un calo delle prestazioni nell'applicazione. Vedi considerazioni . Se utilizzi $where, ogni documento verrà convertito da BSON in oggetto JavaScript prima dell'operazione $where che causerà un calo delle prestazioni. Ovviamente la tua query può essere migliorata se hai un filtro di indice. Inoltre, esiste un rischio per la sicurezza se stai creando la tua query in modo dinamico sulla base dell'input dell'utente.

Il $redact come $where non utilizza indici e non esegue nemmeno una scansione della raccolta, ma le prestazioni della tua query migliorano quando $redact perché è un operatore MongoDB standard. Detto questo, l'opzione di aggregazione è molto migliore perché puoi sempre filtrare il tuo documento usando l'operatore $match.

$where qui va bene ma potrebbe essere evitato. Inoltre credo che tu abbia solo bisogno di $where quando hai un problema di progettazione dello schema. Ad esempio, l'aggiunta di un altro campo booleano al documento con indice può essere una buona opzione qui.