sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo seleccionar subdocumentos con MongoDB

Un poco tarde para la fiesta, pero con suerte ayudará a otros que están buscando una solución. Encontré una manera de hacer esto usando el marco de agregación y combinando $project y $unwind con $match, encadenándolos. Lo he hecho usando PHP, pero deberías entender lo esencial:

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

La primera coincidencia y el proyecto solo se usan para filtrar y hacerlo más rápido, luego el desenredado en la subcolección escupe cada elemento de la subcolección por elemento que luego se puede filtrar utilizando la coincidencia final.

Espero que ayude.

ACTUALIZACIÓN (de Ryan Wheale):

A continuación, puede $group los datos vuelven a su estructura original. Es como tener un $elemMatch que devuelve más de un subdocumento:

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

Traduje esto de Node a PHP, por lo que no lo he probado en PHP. Si alguien quiere la versión de Node, deje un comentario a continuación y lo complaceré.