Ein Mongo-Dokument existiert, das Benutzer und Autos verbindet. Es enthält die folgenden Felder:Doktrin ODM (Mongo) - Upsert eingebettetes Dokument, falls nicht vorhanden
- User.userId
- User.cars []
- User.updated
- User.created
User.cars ist ein Array von eingebetteten Dokumenten . Es muss eine Abfrage geschrieben werden, um nur ein Auto in dieses Feld einzufügen, wenn es noch kein Auto mit der ID $ carId enthält
Die folgende Abfrage erstellt jedes Mal einen neuen Datensatz für $ userId und $ carId. Es sollte entweder keinen neuen Datensatz einfügen oder den Wert für "Getrieben" aktualisieren.
$qb
->findAndUpdate()
->upsert(true)
->field('userId')->equals($userId)
->field('cars.id')->notEqual($carId)
->field('cars')->addToSet([
'id' => $carId,
'driven' => new \DateTime(),
])
->field('updated')->set(new \DateTime())
->field('created')->setOnInsert(new \DateTime())
->limit(1)
;
return $qb->getQuery()->execute();
Entfernen Ungleich ($ carId) aus der Abfrage wird den Datensatz in User.cars immer einsetzen, die auch nicht erwünscht ist.
Das Endergebnis sollte sein, dass User.cars nur einen Datensatz für jede carId enthält.
Möchten Sie auch ''driven'' innerhalb des Arrays aktualisieren, wenn das Element gefunden wurde? Es ist irgendwie überflüssig, '$ addToSet' zu verwenden, wenn Sie tatsächlich einen Teil" einzigartig "(die" ID ") und die andere Teilvariable (den" getriebenen "Wert) haben, da jede Variation des" getriebenen "Wertes a bedeutet neuer Eintrag. Es sollte auch offensichtlich sein, dass die Überprüfung "$ ne" in dem Array nicht gleichzeitig mit einem "Upsert" verwendet werden kann, da jedes fehlende Element ein neues "Dokument" statt eines neuen Array-Elements ergibt. Es gibt bestehende Antworten auf diesen Prozess. Hast du nach ihnen gesucht? –
Ja die meisten Antworten schlagen vor, es als zwei Abfragen zu tun. Die erste führt ein Update auf 'driven' durch, wobei' userId' und 'cars.id' übereinstimmen. Wenn keine Aktualisierung stattfindet, führen Sie eine zweite Abfrage aus, die die obige Abfrage ohne 'notEqual ($ carId)' ist, jedoch möchte ich die Abfrage ändern, um zu verhindern, dass die zweite Abfrage zweimal ausgeführt und das Auto zweimal in den Satz eingefügt wird. Wenn die Abfrage fehlschlagen kann, wenn "$ carId" bereits in der Menge vorhanden ist, die akzeptabel wäre. – lookbadgers
Es ist nicht wirklich ein Fall von "vorschlagen", sondern es ist einfach nicht möglich, etwas anderes zu tun. Ich frage, weil dein '$ ne'-Scheck darauf hindeutet, dass du etwas gesehen hast, um wenigstens die Absicht zu erkennen. Und in der Tat, wenn Sie mit einem "Dokument upsert" mischen, ist es ** drei ** Updates. Es gibt keinen Weg darum herum. Was Sie gelesen haben, ist was Sie tun müssen. –