我的问题是,当我提交表单并将其记录到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中创建的。
答案 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'];
虽然它有效,但我根本不喜欢这个解决方案。有什么想法吗?