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);
我的问题是,当我提交表单并将其记录到 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);