2015-06-10 9 views
8

Qual è il modo migliore per restituire tutti i documenti in una raccolta se si desidera document.a == document.b?

Ho provato

db.collection.aggregate([ { $match: { $eq: [ '$a', '$b' ] } }]) 

ma restituisce senza errori o risultati, perché suppongo che è letteralmente la corrispondenza stringhe "$ A" e "$ b". C'è un modo diverso per specificare che questi sono campi?

db.collection.aggregate([ { $project: { 
    eq: { $cond: [ { $eq: [ '$a', '$b' ] }, 1, 0 ] } 
} }, 
{ $match: { eq: 1 } }]) 

Quanto sopra funziona, ma richiede il passaggio aggiuntivo di interrogazione di nuovo con tutti i documenti trovati o la proiezione di tutti i campi possibili.

Esiste un modo migliore per raggiungere questa query?

+0

Grazie alla tua domanda e il modo di usare per sostituire corrispondenza, ho risolvere uno dei miei problemi! Infatti, ho usato '$ addFields' invece di' $ project', per mantenere la struttura del database come la corrispondenza. – NatNgs

+0

È possibile utilizzare l'espressione di aggregazione nella query regolare in 3.6. Qualcosa come 'db.collection.find ({" $ expr ": {" $ eq ": [" $ a "," $ b "]}})' e in aggregazione con 'db.collection.aggregate ({" $ match ": {" $ expr ": {" $ eq ": [" $ a "," $ b "]}}})' – Veeram

risposta

1

Fondamentalmente, si sta tentando di eseguire un auto join. Un'operazione non supportata da MongoDB.

Per quanto riguarda l'operatore $eq, come avete indovinato:

Non conosco altri modi per eseguire ciò che è necessario rispetto all'utilizzo di un passaggio $project aggiuntivo come suggerito.

Si prega di notare che questo non è significativamente più costoso in quanto, comunque, la vostra query non può utilizzare alcun indice e MongoDB farà una scansione completa.

+0

Grazie. C'è un modo per indicizzare la relazione tra due campi per qualcosa di semplice come uguale/non uguale? –

1

Se ho capito bene la tua domanda, vuoi quei documenti che hanno gli stessi valori in campo1 e campo2.

Per questo cerchiamo

db.coll.find({$where: function() { return this.field1 == this.field2 } }); 

o più compatto

db.coll.find({ $where : "this.field1 == this.field2" }); 
Problemi correlati