MongoDB: Verwenden Sie save() zum aktualisieren eines vorhandenen Dokuments in eine collection
jeder. Ich Liebe manga. Und jetzt Lerne ich zu lieben mongo zu 🙂
Gibt es eine Erklärung des wie verwenden von save() zum aktualisieren eines vorhandenen Dokuments in eine collection in MongoDB PHP? aber ich konnte es nicht anwenden, um die PHP ' s "Wirklichkeit" 🙂
> var mongo = db.things.findOne({name:"mongo"});
> print(tojson(mongo));
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo"}
> mongo.type = "database";
database
> db.things.save(mongo);
> db.things.findOne({name:"mongo"});
{"_id" : "497dab624ee47b3a675d2d9c" , "name" : "mongo" , "type" : "database"}
Hier mein test code:
<?php
$a=array('_id'=>'test_a','field1'=>'anything');
$b=array('_id'=>'test_a','field2'=>'anything else');
$m=new Mongo();
$c=$m->db->test;
$c->save($a);
$c->save($b);//overwrites the previous record
/*
//With update() it works fine
$filter=array('_id'=>'test_a');
$update=array('$set'=>array('field2'=>'anything else'));
$c->update($filter,$update);
//$c->save($filter,$update);//Also tried...
*/
$f=$c->find();
echo $f->count()." found \n";
$i=iterator_to_array($f);//mongo cursos iterator
$m->close();//disconnect mongo
print_r($i);
?>
Tatsache ist, dass in der PHP-Beispiel save() überschreibt das Objekt, während in der JS. B. es aktualisiert. Ich wünschte, ich kann es reproduzieren, in PHP das gleiche wie in JS.
Vielen Dank im Voraus.
- In mongodb.org/display/DOCS/Updating#Updating-ModifierOperations es wird gesagt, dass "speichern" () führt ein einem einfachen Beispiel: wenn x eine _id Feld (x einige JSON-style-Objekt und upsert bedeutet, update, falls vorhanden, einfügen, wenn Sie fehlt)".
- Ich sehe nicht, was das problem ist, nicht die JS-und PHP-Beispiele, die das gleiche tun? Sagen Sie uns, was es ist, Sie erwarten. Erwarte nicht, dass wir die Umgebung einrichten und ausführen von code nur um die Ausgabe zu sehen.
- Danke für die Antwort. Wenn Sie die Ausführung des php-Beispiel, werden Sie sehen, dass save() überschreibt das Objekt, während in der JS. B. es aktualisiert. Ich wünschte, ich kann es reproduzieren, in PHP das gleiche wie in JS.
- Hi @Roger - keine Notwendigkeit Anhängen [GELÖST] an den Titel, es gibt grafische Weise, in der die Fragen mit Antworten akzeptiert werden identifiziert in der Liste.
- Gut, ich bin sorry, wenn du so denkst. Soweit ich weiß, die Seite ist mit einem ernsthaften problem mit SEO-kämpfen gegen die Böschung. Das Wort GELÖST, irgendwo in die Titel kann Hilfe bei der Lösung dieses Problems.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Beispiele sind nicht die gleiche Sache zu tun ...
In der JS-Beispiele, die Sie deklariert das Objekt mongo
Dann, Sie verändert die gleichen Objekt hinzufügen Typ ...
In der PHP-Beispiel deklariert ZWEI Objekte ...
Dies wäre-wie die folgenden in der JS-shell ...
So äpfel ist ein anderes Objekt/Dokument aus Orangen ... also, wenn Sie Sie ausführen speichern() und übergeben Sie das NEUE Objekt, das es Total überschreibt das alte Objekt.
Ihre update() geklappt, weil Sie nach dem Objekt ...
Dann lief das update auf das Objekt; übergeben Sie das neue Feld statt der übergabe eines neues Objekt zu ersetzen ...
In den JS-Beispielen, die Sie nur hatte ein Objekt so ist es im Grunde angehängt, die Sie auf das update, statt Sie zu ersetzen.
Korrekte PHP-Code
Den folgenden PHP würde das replizieren, was Sie getan haben, in die JS-shell ...
Hinweis: ich würde stark empfehlen, Sie setzen nicht Ihr eigenes Objekt _id's und wir statt dessen die Treiber die es für Sie tun, wie ich im Beispiel oben.
save()
wurde gefüttert wird nur mit den arrays Inhalte, nicht, wenn man bedenkt, dass$a
und$b
waren eigentlich verschiedene Objekte. In der Tat, in das JS-Beispiel, es war einfindOne()
vor der "upsert". DiesefindOne()
wird in der PHPupdate()
, wie Sie sagte, in$filter=array('_id'=>'test_a');
so, dass alles, was kommt in das nächste argument eingefügt wird in das Objekt ein. Vielen Dank für Ihr letztes Beispiel war es perfekt._id
um nicht, mich zu wiederholen, für die ich brauche eine einzigartig einfache Weise zu identifizieren, die einen Wert um zukünftige updates. Es war nur natürlich für mich, den_id
Feld. Allerdings, wenn es einen guten Grund, dies nicht zu tun, würde ich gerne es in anderen Bereich und lassen Mongo, um zu entscheiden, seinen eigenen Weg. Würden Sie mir bitte sagen, warum empfehlen Sie nicht, um die_id
Feld?