sql >> Database >  >> NoSQL >> MongoDB

Haal verschillende waarden uit de array op basis van de voorwaarden binnen de array

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.



  1. Duw het element in een willekeurige positie van de array in het subdocument

  2. Hoe geselecteerde meerdere records in een verzameling in MongoDB te verwijderen met behulp van MongoDB-kompas

  3. Redis auth-fout met Node.js en socket.io

  4. Redis lua-script werkt niet