摘要
标题可能没有总结这个问题,但是我不确定如何放置。
简单来说,我有一个位于Mongo数据库中的表格数据集。当用户在网站上打开页面时,PHP后端将从Mongo提取文档,并以Excel风格将其显示给用户。
然后,用户可以随意处理数据,按需要更改单元格,删除行,删除列,保留行,保留列等。完成后,单击保存按钮。这对我来说是个棘手的问题。
在删除/添加或替换列/行时,我不想立即将更改应用于数据库,但是我希望能够单击“保存”按钮并将其全部保存到文档中
背景
使用PHP 7.3,MongoDB和驱动程序类(https://www.php.net/manual/en/book.mongodb.php)
我尝试了两种方法。一个没有做我需要做的,另一个没有做,但是有一个警告。
第一种方法是使用update
方法。但是,每当我重新排序或删除网页中的列/行并单击“保存”按钮时,这些字段就不会重新排序或从Mongo中删除。
第二个要简单得多。我只是删除了旧集合,然后将新数据批量写入了新集合。这确实很简单,但是我不想遇到一个问题,即它删除数据,然后将数据写入新的集合中。
代码
这是我批量写入数据库的方式:
// Prepare to write to Mongo.
$manager->executeCommand('db', new \MongoDB\Driver\Command(["drop" => "test_b"]));
$bulk = new MongoDB\Driver\BulkWrite;
foreach ($dataset as $entry) {
$count = 0;
$arr = array();
foreach ($entry as $info) {
$arr[$fields[$count]] = $info;
$count++;
}
$bulk->insert($arr);
}
这是更新方法:
// Prepare to write to Mongo.
$bulk = new MongoDB\Driver\BulkWrite;
foreach ($dataset as $entry) {
$count = 0;
$arr = array();
$entryId = "temp";
foreach ($entry as $info) {
if ($count == 0) $entryId = $info;
else $arr[$fields[$count]] = $info;
$count++;
}
$objectId = new MongoDB\BSON\ObjectId("$entryId");
$bulk->update(["_id" => $objectId], ['$set' => $arr], ['multi' => false, 'upsert' => false]);
}
结论
我不确定解决此问题的最佳方法。我似乎无法获得更新的工作方式。也许我使用不正确,或者我不知道要使用的正确功能。如果我只是删除集合并重写它,那总是有写错误然后丢失所有数据的可能性。在这种情况下,我可以克隆先前的数据,然后写入新数据,如果写入成功,则终止克隆?
我真的不是要跟踪删除或重新排序的列,而是想以一种安全的方式“用新数据替换旧数据”的简单方法。有什么建议吗?