PHP MongoDB 更新时取消设置字段

PHP MongoDB unset fields on update

我的问题是,当我提交表单并将其记录到 MongoDB 时。

我可以使用更新向文档添加新字段,我可以更改它们的值和键,但我无法删除/取消设置它们。

我是 Mongo 的新手。我通常使用堆栈:MySQL+PHP+Bootstrap,但出于生产原因,我们需要在等式中添加 Mongo。

这是我的 collection 文档的样子:

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

提交时,我可以这样编辑:

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

或者这样:

{
   "_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 中动态创建的。

我设法通过删除文档并再次添加来完成它。

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

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

虽然可行,但我一点也不喜欢这个解决方案。有什么想法吗?

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

使用 $set 修饰符不允许您取消设置字段,它旨在更新您指定的字段。如果你想替换整个文档(实际上只有你传递给函数的数据)你应该写

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