Frågevillkor med .distinct()
gäller "dokumentval" och inte arrayposterna som finns "inom" dokumentet. Om du behöver "filtrera" arrayinnehåll använder du .aggregate()
istället, samt lite efterbearbetning för att bara få "värdena" i arraysvaret.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
Huvuddelarna där är $unwind
pipeline-steg som du gör främst för att du vill att värdena inifrån arrayen ska användas senare som nyckeln till $group
på. Detta producerar i huvudsak ett nytt dokument för varje arraymedlem, men varje dokument innehåller bara den arraymedlemmen. Det "denormaliserar" för MongoDB-strukturer som innehåller arrayer.
Nästa sak är följande $match
pipeline, som fungerar som vilken fråga som helst och bara väljer dokument som matchar villkoren. Eftersom alla arraymedlemmar nu är "dokument" exkluderas icke-matchande poster (som dokument). Du kan alternativt använda $filter
att extrahera medan det fortfarande är en array, men eftersom vi behöver $unwind
för nästa steg kan vi lika gärna bara $match
.
Vid det här laget har du bara de matrisposter som matchar villkoren. $group
är att få "särskilda" värden, så vanligtvis skulle du göra detta över ett bredare urval än bara ett enda dokument eller något där värdena här inte redan är distinkta. Så detta är egentligen bara att behålla samma beteende som .distinct()
intakt.
Slutligen, sedan utdata från .aggregate()
skiljer sig från designen av .distinct()
genom att det returnerar "dokument" i resultat använder vi helt enkelt