Zapytanie o warunki za pomocą .distinct()
dotyczą „wyboru dokumentu”, a nie wpisów tablicy zawartych „w” dokumencie. Jeśli chcesz „filtrować” zawartość tablicy, zastosuj .aggregate()
zamiast tego, a także trochę przetwarzania końcowego, aby uzyskać tylko "wartości" w odpowiedzi tablicy.
db.collection.aggregate([
{ "$match": { "_id": "TEST" } },
{ "$unwind": "$payload" },
{ "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
{ "$group": { "_id": "$payload._id" } },
]).map( d => d._id );
Główne części to $unwind
etap potoku, który robisz głównie dlatego, że chcesz, aby wartości z tablicy były później używane jako klucz do $grupa
na. Zasadniczo tworzy to nowy dokument dla każdego elementu tablicy, ale każdy dokument zawiera tylko ten element tablicy. To "denormalizuje" struktury MongoDB zawierające tablice.
Następna rzecz to $match
potok, który działa jak każde zapytanie i wybiera tylko dokumenty spełniające warunki. Ponieważ wszystkie elementy tablicy są teraz „dokumentami”, niepasujące wpisy (jako dokumenty) są wykluczane. Możesz alternatywnie użyć $filter
do wyodrębnienia, gdy wciąż jest tablicą, ale ponieważ potrzebujemy $unwind
w kolejnym etapie równie dobrze możemy po prostu $match
.
W tym momencie pozostają tylko wpisy tablicy, które spełniają warunki. $group
jest uzyskanie „odmiennych” wartości, więc zwykle robisz to w szerszym zakresie niż tylko pojedynczy dokument lub cokolwiek, w którym wartości tutaj nie są już różne. Tak naprawdę zachowujemy to samo zachowanie .distinct()
nienaruszone.
Wreszcie, ponieważ dane wyjściowe .aggregate()
różni się od projektu .distinct()
ponieważ zwraca „dokumenty” w wynikach, po prostu używamy .map()
metoda przetwarzania wyników kursora i zwracania tylko "wartości" z określonej właściwości dokumentu jako "tablicy".