MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Uzyskaj różne wartości z tablicy na podstawie warunków w tablicy

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".



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Przekazywać zmienne do aktualizacji mongo?

  2. NestJS:Jak zaimplementować uwierzytelnianie użytkownika w oparciu o sesję

  3. czas wyszukiwania z indeksem> bez indeksu

  4. Jak utworzyć dynamiczne zapytanie równości za pomocą Apache Camel i MongoDB?

  5. Wskazówki dotyczące aktualizacji do najnowszej wersji MongoDB