PHP MongoDB在更新时取消设置字段

时间:2017-02-17 11:08:26

标签: php mongodb

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

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

我对Mongo很新。我通常使用堆栈:MySQL + PHP + Bootstrap,但出于生产原因,我们需要将Mongo添加到等式中。

以下是我的收藏文件的外观:

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

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

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

虽然它有效,但我根本不喜欢这个解决方案。有什么想法吗?