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

Sådan vælger du underdokumenter med MongoDB

Lidt sent til festen, men vil forhåbentlig hjælpe andre, der er på jagt efter en løsning. Jeg har fundet en måde at gøre dette på ved at bruge aggregeringsrammen og kombinere $project og $unwind med $match ved at kæde dem sammen. Jeg har gjort det ved hjælp af PHP, men du burde forstå kernen:

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

Det første match og det første projekt bruges bare til at filtrere fra for at gøre det hurtigere, derefter spytter afslapningen på undersamlingen hver undersamling ud for element, som derefter kan filtreres ved hjælp af det endelige match.

Håber det hjælper.

OPDATERING (fra Ryan Wheale):

Du kan derefter $group dataene tilbage i sin oprindelige struktur. Det er som at have en $elemMatch som returnerer mere end ét underdokument:

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

Jeg har oversat dette fra Node til PHP, så jeg har ikke testet i PHP. Hvis nogen vil have Node-versionen, så efterlad en kommentar nedenfor, og jeg vil forpligte det.



  1. MongoDB Opensource vs MongoDB Enterprise

  2. MongoDB:find og findOne med indlejret array-filtrering

  3. find() og findOne() metoderne i MongoDB viser forskellige resultater

  4. Hvordan bestiller MongoDB deres dokumenter i én samling?