Lite sent till festen, men kommer förhoppningsvis att hjälpa andra som är på jakt efter en lösning. Jag har hittat ett sätt att göra detta genom att använda aggregeringsramverket och kombinera $project och $unwind med $matchen, genom att kedja ihop dem. Jag har gjort det med PHP men du borde förstå kärnan:
$ops = array(
array('$match' => array(
'collectionColumn' => 'value',
)
),
array('$project' => array(
'collection.subcollection' => 1
)
),
array('$unwind' => '$subCollection'),
array('$match' => array(
subCollection.subColumn => 'subColumnValue'
)
)
);
Den första matchningen och projektet används bara för att filtrera bort för att göra det snabbare, sedan spottar avkopplingen på undersamlingen ut varje undersamling objekt för objekt som sedan kan filtreras med den sista matchningen.
Hoppas det hjälper.
UPPDATERING (från Ryan Wheale):
Du kan sedan $group
data tillbaka till sin ursprungliga struktur. Det är som att ha en $elemMatch
som returnerar mer än ett underdokument:
array('$group' => array(
'_id' => '$_id',
'subcollection' => array(
'$push' => '$subcollection'
)
)
);
Jag översatte detta från Node till PHP, så jag har inte testat i PHP. Om någon vill ha Node-versionen, lämna en kommentar nedan så tackar jag det.