Schieben Sie ein element an ein array, wenn es nicht vorhanden ist (keine Duplikate)
Habe ich ein Ereignis Sammlung, die ich durchmache, zu finden eine Kategorie, um dem jeweiligen Ereignis und dann bin ich die Aktualisierung meiner anderen Sammlung mit einem $ - push-Anweisung. Das problem ist, dass, wenn zwei Ereignisse haben die gleiche Kategorie, es werden doppelte, die ich nicht will.
Weiß ich über upserts aber ich bin nicht sicher ob das der beste Weg zu gehen über diese? Und ich bin ein bisschen verwirrt, wenn es darum geht, wie man eigentlich schreiben, ein upsert, das funktioniert mit dem "$ "push"-Anweisung.
Dies ist, wie mein update sieht gerade jetzt:
self.users.update({"user_id": event['userid']}, {'$push': {'campaigns': UserCampaign}})
..wo:
UserCampaign = {
"id": campaign['id'],
"name": campaign['name']
}
Den "UserCampaign" gefüllt wird, die gleichen Informationen von Zeit zu Zeit, und da meine Sammlung ist wahrscheinlich gonna werden sehr groß, ich möchte zum Abschluss dieses so effizient wie möglich.
TLDR; ich will update das array in das Dokument gefunden, mit einem "push" - ohne das Risiko, dabei Duplikate.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fand eine bessere Antwort auf mein problem:
Durch die Verwendung von $addToSet es nicht Duplikate erstellen (von mir aus auch sicher, dass keine Duplikate, wo vor durch das hinzufügen von Wörterbüchern eine Liste):
Wenn ich gerade benutzt hatte, $push, es würde immer erstellen Sie doppelte Elemente in "Kampagnen" in der users-Auflistung. Dies geschah mit und ohne upsert.
Aus irgendeinem Grund $jeder hat nicht funktioniert, war aber nicht erforderlich, ich denke, PyMongo kümmert sich für mich.
Versenden Sie über das Dritte argument auf Ihrer update-wie wahr, wie pro die MongoDB Docs und PyMongo Docs.
upserts
Teil. Ich konnte nicht link direkt zu es wie Sie verwenden Sie geschweifte Klammern in die floating-URI-Teil der Ursachen es nicht zum Rendern der link richtig.updates()
. Das Dritte argument für die Funktion ist dieupsert
Flagge.Christian hat die richtigen Argumente in seiner Antwort, also werde ich verlassen, dass ein Teil allein (von Ihnen positiv bewertet werden, seine Antwort).
Aber Sie auch bitten, über die Vermeidung von Dubletten etc.
Der Schlüssel hier ist, um sicherzustellen, dass die Kriterien, Teil der update-Abfrage wird spezifisch auf die Ebene, die Sie wollen. Ein upsert (oder ein update) ist nur so gut wie die Kriterien, die Sie gehen in es. Ein einem einfachen Beispiel: legen Sie ein neues Dokument, wenn Sie es nicht finden, das den Kriterien entspricht, und aktualisieren Sie nur die $drücken (oder was auch immer update angegeben ist), wenn die Kriterien der übergeben wird, wird gefunden (können Sie multi-update, wenn mehr als ein doc ist auch gefunden).
In Ihrem Fall die Kriterien, Teil:
Stellen Sie sicher, dass dieses Teil ist einzigartig und Sie werden in Ordnung sein - wenn diese übereinstimmen können Sie mehr als ein Dokument, dann wirst du die Duplikate zu haben.