【问题标题】:Flutter Firebase firestore append data with unique IDFlutter Firebase firestore 附加具有唯一 ID 的数据
【发布时间】:2021-09-22 21:17:41
【问题描述】:

我正在开发 Flutter 应用程序,用户可以在其中保存多个地址。以前我使用实时数据库,我更容易将数据推送到具有唯一 ID 的任何孩子中,但出于某种原因,我改为使用 Firestore,并且希望通过 Firestore 实现相同的目标。因此,我生成了 UUID 来创建唯一 ID 以附加到 user_address

这就是我想要的

user_address 看起来像这样

这就是它在 Firestore 中的保存方式

所以我的问题是我如何附加具有唯一 ID 的数据,我必须在 users 字段内创建一个集合还是上述可能?

下面是我尝试setupdate 甚至用户FieldValue.arrayUnion(userServiceAddress) 的代码,但没有得到想要的结果

var uuid = Uuid();
var fireStoreUserRef =
    await FirebaseFirestore.instance.collection('users').doc(id);

Map locationMap = {
  'latitude': myPosition.latitude,
  'longitude': myPosition.longitude,
};

var userServiceAddress = <String, dynamic>{
  uuid.v4(): {
    'complete_address': completedAddressController.text,
    'floor_option': floorController.text,
    'how_to_reach': howtoreachController.text,
    'location_type': locationTag,
    'saved_date': DateTime.now().toString(),
    'user_geo_location': locationMap,
    'placeId': addressId
  }
};

await fireStoreUserRef.update({'user_address':  userServiceAddress});

如果我使用setupdate,那么整个数据将被替换为未附加的新值,因此创建一个集合是这里唯一的解决方案,如果我创建一个集合,我会遇到什么问题吗?

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    通过将地址存储在具有一对多关系的单独集合中,您本身不会有任何问题,但根据您的使用情况,您可能会看到使用这种方法更高的读/写请求。这可能会大大增加超出预算的可能性。

    幸运的是,Firestore 允许通过点表示法更新嵌套对象中的字段。试试这个:

    var userServiceAddress = {
      'complete_address': completedAddressController.text,
      'floor_option': floorController.text,
      'how_to_reach': howtoreachController.text,
      'location_type': locationTag,
      'saved_date': DateTime.now().toString(),
      'user_geo_location': locationMap,
      'placeId': addressId
    };
    
    await fireStoreUserRef.update({'user_address.${uuid.v4()}':  userServiceAddress});
    

    【讨论】:

    • 谢谢,这就是我一直在寻找的东西,所以如果我们的预算有限,按照你的说法创建一个集合不是一个好主意??所以只需要将必要的项目添加到集合中?
    • 如果你能帮助我们如何处理这个问题假设一个新用户注册并且还没有保存地址,所以没有创建 user_address 字段那么当我尝试时如何检查它是否为空检查它是否给了我错误,例如“不存在错误的状态字段”
    • 正确。读/写操作在 document 级别。因此,无论存储多少个地址,通过此方法读取用户documentuser_address 字段中的地址都算作一次读取操作。如果您要使用单独的“地址”集合,那么具有 5 个地址的用户将需要对具有地址的用户对象执行 6 次读取操作。
    • 我建议用示例代码提出一个新问题,说明您如何尝试检查 user_address 字段的值。
    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2012-08-27
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多