在MongoDB中更新文档时,是否有功能/功能在更新时删除行或列?

时间:2019-07-03 13:28:41

标签: php mongodb

摘要

标题可能没有总结这个问题,但是我不确定如何放置。

简单来说,我有一个位于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]);
}

结论

我不确定解决此问题的最佳方法。我似乎无法获得更新的工作方式。也许我使用不正确,或者我不知道要使用的正确功能。如果我只是删除集合并重写它,那总是有写错误然后丢失所有数据的可能性。在这种情况下,我可以克隆先前的数据,然后写入新数据,如果写入成功,则终止克隆?

我真的不是要跟踪删除或重新排序的列,而是想以一种安全的方式“用新数据替换旧数据”的简单方法。有什么建议吗?

0 个答案:

没有答案