Vraag naar voorwaarden met .distinct()
zijn van toepassing op "documentselectie" en niet op de array-items die "in" het document zijn opgenomen. Als u array-inhoud moet "filteren", past u .aggregate()
in plaats daarvan, evenals een beetje nabewerking om alleen de "waarden" in het array-antwoord te krijgen.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
De belangrijkste onderdelen daar zijn de $unwind
pijplijnfase die u voornamelijk doet omdat u wilt dat de waarden uit de array later worden gebruikt als de sleutel tot $group
Aan. Dit levert in wezen een nieuw document op voor elk arraylid, maar elk document bevat alleen dat arraylid. Het is "denormaliserend" voor MongoDB-structuren die arrays bevatten.
Het volgende is het volgende $match
pijplijn, die werkt zoals elke query en alleen documenten selecteert die aan de voorwaarden voldoen. Aangezien alle arrayleden nu "documenten" zijn, worden niet-overeenkomende vermeldingen (als documenten) uitgesloten. U kunt ook $filter
gebruiken
uitpakken terwijl het nog steeds een array is, maar omdat we $unwind nodig hebben
voor de volgende fase kunnen we net zo goed $match
.
Op dit punt houdt u alleen de array-items over die overeenkomen met de voorwaarden. De $group
is om "verschillende" waarden te verkrijgen, dus normaal gesproken zou u dit doen over een bredere selectie dan alleen een enkel document of iets waar de waarden hier nog niet duidelijk zijn. Dus dit is eigenlijk gewoon hetzelfde gedrag van .distinct()
intact.
Ten slotte, sinds de uitvoer van .aggregate()
verschilt van het ontwerp van .distinct()
omdat het "documenten" in resultaten retourneert, gebruiken we gewoon de .map()
methode om de cursorresultaten te verwerken en alleen de "waarden" van de specifieke documenteigenschap als een "array" te retourneren.