2016-11-04 1 views
0

HintergrundinformationenWie fügt man Informationen zu einem Dokument in Mongo an?

Ich habe folgende Daten in meiner Mongo Datenbank:

{ "_id" : 
     ObjectId("581c97b573df465d63af53ae"), 
     "ph" : "+17771111234", 
     "fax" : false, 
     "city" : "abd", 
     "department" : "", 
     "description" : "a test" 
} 

ich jetzt schreibe ein Skript, das eine Schleife durch eine CSV-Datei werden die Daten enthält, die ich an die anhängen müssen Dokument. Zum Beispiel könnten die Daten wie folgt aussehen:

+17771111234, 10:15, 12:15, [email protected] 
+17771111234, 1:00, 9:00, [email protected] 

Letztlich möchte ich mit einem Mongo Dokument am Ende, das wie folgt aussieht:

{ "_id" : 
     ObjectId("581c97b573df465d63af53ae"), 
     "ph" : "+17771111234", 
     "fax" : false, 
     "city" : "abd", 
     "department" : "", 
     "description" : "a test", 
     "contact_locations": [ 
      { 
       "stime": "10:15", 
       "etime": "12:15", 
       "email": "[email protected]" 
      }, 
      { 
       "stime": "1:00", 
       "etime": "9:00", 
       "email": "[email protected]" 
      }, 
     ] 
} 

Problem

Der Code I‘ In der Praxis werden neue Dokumente erstellt, anstatt an die vorhandenen angehängt zu werden. Und tatsächlich erstellt es nicht einmal ein neues Dokument pro Zeile in der CSV-Datei ... was ich noch nicht genug getestet habe, um wirklich zu verstehen warum.

-Code

Für jede Zeile in der CSV-Datei, ich bin mit der folgenden Logik

while(!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) { 
    //code that massages the $row into the way I need it to look. 
    $data_to_submit = array('contact_locations' => $row); 
    echo "proving that the record already exists...: <BR>"; 
    $cursor = $contact_collection->find(array('phnum'=>$row[0])); 
    var_dump(iterator_to_array($cursor)); 

    echo "now attempting to update it....<BR>"; 
    // $cursor = $contact_collection->update(array('phnum'=>$row[0]), $data_to_submit, array('upsert'=>true)); 
     $cursor = $contact_collection->insert(array('phnum'=>$row[0]), $data_to_submit); 
    echo "AFTER UPDATE <BR><BR>"; 
    $cursor = $contact_collection->find(array('phnum'=>$row[0])); 
    var_dump(iterator_to_array($cursor)); 
    } 
} 

Fragen

  1. Gibt es eine Möglichkeit, „anhängen "zu Dokumenten? Oder muss ich das vorhandene Dokument greifen, als ein Array speichern, mein Array von Kontaktstellen mit dem Hauptdokument zusammenführen und dann erneut speichern?

  2. Wie kann ich abfragen, ob das Objekt "contact_locations" bereits in einem Dokument vorhanden ist?

Antwort

1

Hi ja du kannst es tun!

1. benötigen Sie Ihr Dokument zu finden und drücken Sie den neuen Wert, den Sie benötigen:

Verwendung findAndModify und $addToSet:

$cursor = $contact_collection->findAndModify(
    array("ph" => "+17771111234"), 
    array('$addToSet' => 
     array(
      "contact_locations" => array(
       "stime"=> "10:15", 
       "etime"=> "12:15", 
       "email"=> "[email protected]" 
      ) 
     ) 
    ) 
); 

Der beste Teil ist $addToSet wont 2 Mal hinzufügen das gleiche Material so werden Sie zweimal den gleichen Wert nicht haben :)

Hier werden die Dokumente https://docs.mongodb.com/manual/reference/operator/update/addToSet/

0

Ich bin nicht sicher, die genaue Syntax in PHP, wie ich es noch nie getan habe, aber ich mache das gleiche in JS mit MongoDB und $push ist die Methode, die Sie suchen. Auch wenn ich ein wenig pingelig bin, empfehle ich $ contact_collection zu $ ​​contact_locations als Variablennamen zu ändern. Array-Variablennamen sind normalerweise plural und beschreibender ist immer besser. Stellen Sie außerdem sicher, dass Sie zuerst das Array in der MongoDB finden, an das Sie anhängen möchten, und dass Sie den Befehl "update" von MongoDb verwenden,

Verwandte Themen