Ich habe eine lists
Sammlung, wo jedes Dokument ein Array von members
hat. Jedes Element des Arrays members
ist ein Dokument mit der Eigenschaft email
, creation date
und einigen anderen Metas. Ich habe einen eindeutigen Index für members.email
, um zu verhindern, dass dieselbe E-Mail zweimal in dieselbe Liste eingegeben wird, aber ich möchte den ursprünglichen date
-Wert behalten. Leider scheinen weder $addToSet
noch $push
dies zu tun.
Beispiel mit $ push:
%Vor%Und mit $ addToSet:
%Vor% Beide Beispiele ersetzen das gesamte eingebettete Dokument durch das neue, da (wie ich annehme) der eindeutige Wert date
. Ist es möglich, nur $push
das Dokument "member" zu erstellen, wenn members.email
noch nicht existiert oder muss ich das in zwei Befehlen machen?
Alternativ wäre es besser skalierbar, die members
in ihre eigene Sammlung mit einer parent_list
-ähnlichen Eigenschaft zu setzen?
Nach meiner Erfahrung liegt der Grund, warum Sie nicht "$ push" oder "$ addToSet" verwenden können, darin, dass Ihr Ziel "members" wahrscheinlich ein eingebettetes Objekt ist (oder nach seiner Erstellung in eins konvertiert wurde). Sie können nur $ push, $ pushAll, $ addToSet für eingebettete Arrays verwenden ...
Leider für uns PHP-Entwickler eine Cursor-Abfrage gibt immer die Daten als Arrays, der beste Weg zu überprüfen, ob etwas wie "Mitglieder" ist ein Array oder ein Objekt, ist eine find () in der Mongo-Shell und suchen für die geschweiften / eckigen Klammern ("{}" oder "[]") im Ergebnis.
Hoffe, das hilft.
Warum haben Sie keine Sammlung, in der Sie list_id, email, added_date speichern? Sie würden dann einen eindeutigen Index für 2 Schlüssel list_id und email erstellen. Das würde das Einfügen verhindern eines Datensatzes mit der gleichen List_id und E-Mail
Es wird keine eingebetteten Dokumente geben. Sie können find () weiterhin mit list_id
verwenden Verwenden Sie $ne
im Abfragebefehl, um Dokumente mit Mitgliedern derselben E-Mail zu filtern:
Ja, das ist möglich. Sehen Sie sich den $ exist-Operator im Abschnitt erweiterte Abfragen von mongoDB an. Codieren Sie eine $ exist-Bedingung in eine where-Anweisung, die nur dann aktualisiert wird, wenn die E-Mail der Mitglieder nicht existiert.
IIUC, versuchen Sie Upsert , um das eingebettete Dokument (falls vorhanden) oder zu aktualisieren Fügen Sie es ein (falls nicht). Siehe auch dies .
Was Ihre zweite Frage bezüglich der Skalierbarkeit anbelangt, ist es wirklich fallabhängig ... Das Einbetten des Dokuments in das Parent erfordert härtere Aktualisierungen und einen größeren Datenabruf, reduziert aber die Anzahl der Abrufabfragen.