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

Come selezionare i documenti secondari con MongoDB

Un po' in ritardo per la festa, ma si spera possa aiutare gli altri che cercano una soluzione. Ho trovato un modo per farlo usando il framework di aggregazione e combinando $project e $unwind con $match, concatenandoli insieme. L'ho fatto usando PHP ma dovresti ottenere il succo:

    $ops = array(
        array('$match' => array(
                'collectionColumn' => 'value',
            )
        ),
        array('$project' => array(
                'collection.subcollection' => 1
            )
        ),
        array('$unwind' => '$subCollection'),
        array('$match' => array(
                subCollection.subColumn => 'subColumnValue'
            )
        )
    );

La prima corrispondenza e il primo progetto vengono utilizzati solo per filtrare per renderlo più veloce, quindi lo svolgimento della sottoraccolta sputa ogni elemento della sottoraccolta per elemento che può quindi essere filtrato utilizzando la corrispondenza finale.

Spero di esserti stato d'aiuto.

AGGIORNAMENTO (da Ryan Wheale):

Puoi quindi $group i dati tornano alla loro struttura originale. È come avere un $elemMatch che restituisce più di un documento secondario:

array('$group' => array(
        '_id' => '$_id',
        'subcollection' => array(
            '$push' => '$subcollection'
        )
    )
);

L'ho tradotto da Node a PHP, quindi non l'ho testato in PHP. Se qualcuno vuole la versione Node, lascia un commento qui sotto e sarò obbligato.