MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Rufen Sie unterschiedliche Werte aus dem Array ab, basierend auf Bedingungen innerhalb des Arrays

Abfragebedingungen mit .distinct() beziehen sich auf die "Dokumentauswahl" und nicht auf die "innerhalb" des Dokuments enthaltenen Array-Einträge. Wenn Sie Array-Inhalte „filtern“ müssen, wenden Sie .aggregate() stattdessen sowie ein wenig Nachbearbeitung, um nur die "Werte" in der Array-Antwort zu erhalten.

db.collection.aggregate([
  { "$match": { "_id": "TEST" } },
  { "$unwind": "$payload" },
  { "$match": { "payload.status": { "$in": ["TRUE","FALSE"] } } },
  { "$group": { "_id": "$payload._id" } },
]).map( d => d._id );

Die Hauptteile dort sind $unwind Pipeline-Phase, die Sie hauptsächlich tun, weil Sie möchten, dass die Werte aus dem Array später als Schlüssel für $group an. Dadurch wird im Wesentlichen ein neues Dokument für jedes Array-Mitglied erstellt, aber jedes Dokument enthält nur dieses Array-Mitglied. Es "denormalisiert" MongoDB-Strukturen, die Arrays enthalten.

Das nächste ist das folgende $match Pipeline, die wie jede Abfrage funktioniert und nur Dokumente auswählt, die den Bedingungen entsprechen. Da alle Array-Mitglieder jetzt "Dokumente" sind, werden nicht übereinstimmende Einträge (als Dokumente) ausgeschlossen. Alternativ können Sie $filter verwenden um zwar noch ein Array zu extrahieren, aber da brauchen wir $unwind für die nächste Stufe können wir auch einfach $match verwenden .

An dieser Stelle bleiben Ihnen nur die Array-Einträge übrig, die den Bedingungen entsprechen. Der $group ist es, "unterschiedliche" Werte zu erhalten, also würden Sie dies normalerweise über eine größere Auswahl als nur ein einzelnes Dokument oder alles tun, wo die Werte hier nicht bereits unterschiedlich sind. Das ist also wirklich nur das Beibehalten des gleichen Verhaltens von .distinct() intakt.

Schließlich, da die Ausgabe von .aggregate() unterscheidet sich vom Design von .distinct() Da es in den Ergebnissen „Dokumente“ zurückgibt, verwenden wir einfach den Code <>.map() Methode, um die Cursor-Ergebnisse zu verarbeiten und nur die "Werte" aus der spezifischen Dokumenteigenschaft als "Array" zurückzugeben.