2016-05-11 7 views
0

Ich mache eine Anwendung in Symfony2 und mit dem doctrine mongodb odm Bundle. Ich habe ein Dokument mit einer ID, die Strategie = NONE, wie (nur ein Schnipsel) hat:Ein Upsert verhindern, wenn id angegeben ist mongodb odm

use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; 

/** 
* @MongoDB\Id(strategy="NONE") 
* @var string 
*/ 
private $id; 

Später beim Einfügen, jedes Mal wenn ich die ID angeben vor dem Aufruf anhalten, auf die Protokolle Überprüfung finde ich, dass ein Upsert wurde anstelle von BatchInsert durchgeführt. Nach einigem Googeln bin ich auf this link gestoßen, was mir bestätigte, dass dies tatsächlich der Fall ist.

Meine Frage ist daher: Wie kann vermieden werden, dass das Upsert passiert, nachdem ich die ID des Objekts angegeben habe?

Ps: Ich brauche das, weil mit dem upsert doctrine mongodb odm wird aktualisiert, falls es die ID bereits dort findet, aber ich will es wie ein Duplikat zu sehen und werfen Sie eine MongoDuplicateKeyException.

Antwort

0

Wie Sie bemerkt, ODM wird neues Dokument, wenn seine Kennung UPSERT gesetzt wird während der anfänglichen anhalten (oder Kennung wird während prePersist Ereignis erzeugt), here Sie können in UnitOfWork entsprechenden Code sehen. Damit das Dokument eingefügt werden kann, müssen Sie die ID-Strategie Ihres Dokuments auf CUSTOM ändern und Ihren eigenen Generator verwenden. Informationen dazu finden Sie am Ende von this docs chapter.

+0

Danke für Ihre Antwort; fühlt sich definitiv wie die Richtung an, die ich nehmen sollte. Mein einziges Problem ist jetzt, dass ich anscheinend nicht herausfinden kann, wie ich (in meinem ID Generator, der das 'Doctrine \ ODM \ MongoDB \ Id \ AbstractIdGenerator' erweitert) den' $ param' in 'setId ($ param) "Ruf an, innerhalb meiner späteren ID. – anka

+0

Ich bin mir nicht sicher, was "$ param" Sie meinen? Im Allgemeinen muss Ihr Generator die ID zurückgeben, ODM wird sie später zu dem fraglichen Dokument setzen. – malarzm

+0

Nochmals vielen Dank [malarzm] (http://stackoverflow.com/users/5982920/malarzm) für die Hilfe. Mit '$ param 'bezeichne ich den Wert, den ich als ID des $ -Objekts setzen möchte, bevor ich ihn an persistieren lasse, wie' persist ($ object) '. Der setId-Aufruf würde wie '$ object-> setId ($ param)' sein, irgendwo nach der Instanziierung von $ object, aber vor 'persist ($ object)'. Gibt es eine Möglichkeit, auf diesen Wert (von $ param) innerhalb des Generators zuzugreifen? – anka

Verwandte Themen