sql >> Databasteknik >  >> NoSQL >> MongoDB

Få distinkta värden från array baserat på förhållanden inom arrayen

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 .map() metod för att bearbeta markörresultaten och returnera endast "värdena" från den specifika dokumentegenskapen som en "array".



  1. Varför skapar mongoDB Node-drivrutinen oönskade anslutningar?

  2. mongodb ansluta med php

  3. Syntax saknas; före uttalande i mongoexport

  4. Spring MongoRepository uppdaterar eller upphäver istället för att infoga