2017-02-17 15 views
0

私の問題は、フォームを送信してMongoDBに記録するときです。PHP MongoDBの更新時にフィールドが設定されていない

更新を使用してドキュメントに新しいフィールドを追加できます。値とキーを変更できますが、削除/設定解除できません。

私はかなりMongoを新しくしています。私は通常、スタックを使って作業します:MySQL + PHP + Bootstrapですが、生産上の理由から、Mongoを方程式に追加する必要があります。

{ 
    "_id": ObjectId("58a44a61e09075e805d63af1"), 
    "en": "Cat", 
    "de": "Katze", 
    "fr": "Chat", 
} 

またはこの方法:

{ 
    "_id": ObjectId("58a44a61e09075e805d63af1"), 
    "en": "Cat", 
    "de": "Katze", 
    "es": "Gato", 
} 

を提出する時には、私はこのようにそれを編集することができます:ここでは

は私のコレクションの文書がどのように見えるかです

{ 
    "_id": ObjectId("58a44a61e09075e805d63af1"), 
    "en": "Cat", 
    "de": "Katze", 
    "es": "Gato", 
    "fr": "Chat", 
} 

しかし、私はこれをすることができません:

{ 
    "_id": ObjectId("58a44a61e09075e805d63af1"), 
    "en": "Cat", 
    "de": "Katze" 
} 

は、ここに私のフォームです:

<form role="form" action="" method="post"> 
    <table> 
    <?php 
     foreach ($glossary as $term) { 
     foreach (array_slice($keys,1) as $key => $value) { 
      echo "<tr id='language" . $key . "' class='languages'>"; 
       echo "<td>"; 
        echo "<select class='form-control' name='lang" . $key . "'>"; 
        echo "<option value='' selected></option>"; 
        // Options not shown for simplicity. 
        echo "</select>"; 
       echo "</td>"; 
       echo "<td>"; 
        echo "<input class='form-control' value='$term[$value]' name='langInput" . $key . "'>"; 
       echo "</td>"; 
      echo "</tr>"; 
     } 
     } 
    } 
    ?> 
    </table> 

<input type="submit" name="submit" class="btn btn-primary" value="Save Changes"> 

では、私が提出:

$termArray = array(); 

    // Get submitted form vars 
    for ($i = 0; $i <= $loop; $i++) { 
     $langCode = cleanFormFld($_POST["lang".$i]); 
     $termArray[$langCode] = cleanFormFld($_POST["langInput".$i]); 
    } 

    try {   
     $connection = new Mongo("mongodb://$dbhost"); 
     $db = $connection->$dbname; 

     $db->terms->update(array('_id' => new MongoId($id)), array('$set' => $termArray)); 
    } 
    catch(PDOException $e) { 
     echo "Error: " . $e->getMessage(); 
    } 

すべてlangXとlangInputXはjQueryのでdinamicaly作成されます。

+0

多分私は混乱しているかもしれませんが、あなたは['$ pull'](https://)を必要とします。 docs.mongodb.com/manual/reference/operator/update/pull/)配列の要素を取り除く '$ set'の代わりに –

+0

hdをありがとうが、私はちょうど$ pullを使用しましたが、何も起こりませんでした。 – anexo

答えて

1
$db->terms->update(array('_id' => new MongoId($id)), array('$set' => $termArray)); 

が未設定フィールドにあなたを許可していません、それはあなたが指定したフィールドを更新することを目指しています。

$db->terms->update(array('_id' => new MongoId($id)), $termArray); 
0

ドキュメントを削除してもう一度追加すると、正常に機能します。

$db->terms->remove(array('_id' => new MongoId($id))); 

$db->terms->insert($termArray); 
$id = $termArray['_id']; 

これは機能しますが、私はこの解決策がまったく嫌です。何か案は? $set修飾子を使用して

関連する問題