MongoDB: $ addToSet / $ Push-Dokument nur, wenn es nicht bereits existiert

8

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?

    
Kevin 05.12.2010, 01:12
quelle

5 Antworten

5

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.

    
bm_i 16.08.2011 08:18
quelle
1

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     
Dmitri 05.12.2010 03:48
quelle
1

Verwenden Sie $ne im Abfragebefehl, um Dokumente mit Mitgliedern derselben E-Mail zu filtern:

%Vor%     
kelvinhust 26.06.2014 08:25
quelle
0

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.

    
Anthony Jack 05.12.2010 07:32
quelle
0

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.

    
Hertzel Guinness 05.01.2012 20:38
quelle

Tags und Links