PHP Firebase API - 从嵌套文档中删除子元素

3
我正在使用php sdk从firestore数据库中删除某些字段。 我想要从文档内的数组中删除一个map,但是使用的函数删除了父级数组内的所有map。
我的firestore数据库如下图所示: firebase database 我尝试删除特定索引(例如:索引0及其子元素)的imageUrls数组,而不是其中的所有map。
我尝试了以下两个函数:
$usersRef->update([
        ['path' => 'imageUrls.image_url', 'value' => FieldValue::arrayRemove(['image.png'])]
    ]);

并且这一个

$usersRef->update([
    ['path' => 'imageUrls.image_url', 'value' => FieldValue::deleteField()]
]);

第一个函数会删除所有的图片链接子元素,并将图片链接数组转换为映射类型;而第二个函数则没有发生任何事情。文档中仍然存在所有字段,没有进行任何删除操作。

<?php 

namespace App\Services;
use Google\Cloud\Firestore\FirestoreClient;
use Google\Cloud\Firestore\FieldValue;
use Google\Cloud\Firestore\FieldPath;

class FirebaseService
{
    public function delete()
    {
        // Create the Cloud Firestore client
        $db = new FirestoreClient(
            ['projectId' => 'MyProjectId']
        );

        $usersRef = $db->collection('NewStories')->document('1');

        $usersRef->update(
                         [
                              ['path' =>'imageUrls.image_url', 
                              'value' => FieldValue::arrayRemove(['image.png'])]
                         ]);  
    }
}

我刚刚尝试了第二个选项(FieldValue :: deleteField()),并且它对我有效。 - Francisco Luz
1个回答

1
这可以通过使用arrayRemove()方法来实现。正如Firestore的PHP客户端所述:

返回一个特殊值,可用于set()、create()或update(),告诉服务器从已存在于服务器上的任何数组值中删除给定元素。将从数组中删除指定的每个元素的所有实例。如果要修改的字段尚未是数组,则将其覆盖为一个空数组。


更新:

Firebase不支持更新索引数组中的现有元素。更多信息可以在官方文档中找到。

解决方法:

从文档中读取整个数组,在内存中进行修改,然后完全更新修改后的数组字段。**

感谢Firestore在数组字段中更新单个项目案例。


1
请查看类似的操作系统案例 - sllopis
这并没有帮助,他们没有给出解决方案,反而要求更新文档,但仍然保持索引零是问题。 - Aref Makke
1
我会尝试从概念上解释对你有用的内容。你需要获取文档“1”的引用,这一步你已经完成了。然后,你需要访问imgeUrls数组。接下来,你需要进入更深层次的嵌套数组“0”或“1”,就像图片中所示,以便能够使用值“image.png”更新和删除字段“image_url”。这可能会给你一个代码方面的想法在这里 - sllopis
我几天前更新了我的答案,并提供了一个解决方法,这个方法对其他社区用户有效。你能使用这个解决方法修改该字段的值吗? - sllopis
我在长时间的搜索后使用了你上面提到的OS case的解决方案,因为我没有找到更好的解决方案,所以我按照你的解决方案版本进行了操作。 - Aref Makke
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接