CodamAIDocs
Themafertig

Sammlungen durchsuchen mit MEMBEROF

Wie man findet, in welchen Objekten eine Liste ein bestimmtes Element enthält, und warum MEMBEROF auf einem Nicht-Listenfeld abgelehnt wird.

Ausprägungen
per IDin einer ODER-Gruppekein Listenfeld → 400ungültige UUID → 400

Worum es geht

Eine Firma hat eine Liste employees. Du hast einen Mitarbeiter und willst wissen: In welchen Firmen steht er in der Liste? Bei n:m-Beziehungen, etwa Benutzer und Gruppen, kann das mehr als eine sein.

{ "key": "employees", "value": "7f3…", "param": "MEMBEROF" }

Das Mengenbild

flowchart LR
    subgraph A["Firma Codamic"]
        a1["Daniel 7f3…"]
        a2["Eva 2c9…"]
    end
    subgraph B["Firma Acme"]
        b1["Anna 8b1…"]
    end
    Q["employees MEMBEROF 7f3…"] -.->|"enthält Daniel"| A
    Q -.->|"enthält Daniel nicht"| B

Ergebnis: nur „Codamic“.

Wie CDMS die Frage stellt

CDMS verbindet die Liste nicht mit der Hauptabfrage, sondern stellt für jedes Objekt eine eigene Ja/Nein-Frage an die Datenbank (EXISTS):

SELECT … FROM company c
WHERE EXISTS (SELECT 1 FROM c.employees m WHERE m.id = '7f3…')

Das hat zwei Folgen:

  1. Eine Firma erscheint genau einmal, und totalCount stimmt.
  2. Firmen ohne Mitarbeiter bleiben in der Suche, wenn eine andere Bedingung einer ODER-Gruppe sie trifft.

Alle Ausprägungen

MEMBEROF in allen Formen

Wann: Die Liste enthält Objekte (Referenzen), z. B. employees, roles, groups.

value ist die id des gesuchten Objekts: { "key": "employees", "value": "7f3…", "param": "MEMBEROF" }.

Ergebnis: Alle Objekte, deren Liste dieses Objekt enthält.

Wann: „Firmen mit Daniel oder Firmen namens Acme“

{ "type": "OR", "filter": [ { "key": "employees", "value": "7f3…", "param": "MEMBEROF" }, { "key": "companyname", "value": "Acme", "param": "EQ" } ] }

Ergebnis: Codamic und Acme, jede einmal.

Wann: { "key": "company", "value": "a1…", "param": "MEMBEROF" } auf employee, company ist aber eine Einzelreferenz.

  1. 1
    CDMS
    prüft, ob company eine Liste ist
  2. 2
    CDMS→Client
    nein → 400 memberof-needs-collection|company

Ergebnis: Für Einzelreferenzen nimmst du { "key": "company.id", "value": "a1…", "param": "EQ" }.

Wann: Liste von Objekten, aber value ist keine UUID, z. B. "xyz".

CDMS kann den Wert nicht als ID lesen.

Ergebnis: 400 wrong-uuid-in-where|xyz

MEMBEROF oder Pfad?

Zwei Wege, eine Liste zu durchsuchen
MEMBEROF
employees MEMBEROF 7f3…
  • prüft ein bestimmtes Objekt über seine id
  • jedes Objekt höchstens einmal, totalCount stimmt
  • funktioniert in ODER-Gruppen ohne Überraschung
Pfad
employees.lastname LIKE M%
  • vergleicht ein Feld der Listeneinträge mit jedem Operator
  • ein Objekt kommt einmal in data
  • totalCount zählt jeden passenden Listeneintrag, siehe Pfade
Quellen im Code und in der Wissensdatenbank
  • CDMS/cdms-persistence-database – DatabaseConditionBuilder.memberOf
  • CDMS/cdms-integrationtest – AbstractManyToManyTest; Probe 2026-09-21
Suchen