【问题标题】:Randomly pairing users in Firebase [closed]在 Firebase 中随机配对用户 [关闭]
【发布时间】:2020-12-22 01:42:30
【问题描述】:

我正在使用 Flutter 和 Firebase 开发一个应用程序,我必须解决一个听起来像这样的问题:

  • 每个用户(在任何时候)都可以将自己放入等待名单
  • Firebase 必须通过创建(随机)用户对来处理等待名单

我的想法是在 Cloud Firestore 中为等待列表创建一个集合,其中每个用户都是一个文档和一个 云函数,它通过搜索其他用户(文档) 在集合中删除两个文档(即从等待列表中删除用户)并在另一个集合中创建另一个文档来表示该对。 主要问题是设计(如果可能)一个事务,以保证同一云功能的两个或多个执行不重叠。 有什么建议吗?或者有什么其他方法可以解决这个问题? 谢谢!

【问题讨论】:

  • 您的意思是,候补名单中有一个人,或者其他人“随机”与该人配对?或者等候名单中必须有最少人数?我认为您不需要使用云功能来做到这一点
  • 只要等候名单中有(至少)2 人,我就可以将他们配对。你如何建议这样做?用户只将自己放在列表中。用户配对过程必须自动化。
  • 当有人选择将自己放在列表中时,我会说代码,“如果此集合(等待列表)中的文档存在,则将其删除并在此其他集合中创建另一个文档(配对);否则,在等待列表中创建一个文档”。
  • 你可以在用户上有一个字段,'paired: true/false' 并在查询中添加一个条件,比如 waiting-list-collection.where(paired, isEqualTo: false).get( ),而不是删除文档,您可以在进行“配对”时首先更新该字段
  • 是的,我也通过了这个。这样做我应该如何执行查询?我想在交易里面。而且......如果事务失败(例如,因为所选文档是与另一个事务配对的目标)Firebase 如何处理这种情况?

标签: firebase function flutter google-cloud-firestore cloud


【解决方案1】:

您可以使用Unique ID 和如下数据将所有用户放在一个文档中:

然后您可以使用 Cloud Function 来执行以下操作:

  1. 从特定文档中检索名为 waitingArray。它 会将新帐户 user id 添加到该数组中。

  2. 如果array 至少有 2 个元素。它将添加一个新的 array of mapswaiting 列表中的 2 个元素中命名为 paired 和 将值添加到 Firestore。它将调用现有的 paired array 并添加新的 2 个元素并将其保存到 Firestore。同时更新 paired_with 字段 用户文档。

  3. 它将从等待列表中删除 2 个元素更新一个空 列表。

【讨论】:

  • 我创造了更复杂的东西。如果您有疑问,请询问。
  • 谢谢!我的疑问是......因为我将所有配对系统保存在一个文档中,这个解决方案是否可扩展?如果我有足够多的交易同时发生,其中一个会成功,而其他的会继续失败?
  • 其实如果你使用云触发功能,等待列表的元素永远不会超过2个。因为当它获得至少 2 个元素时,它将创建该对并保存一个新的空列表。就好像您在每个用户文档中保存了一个paired_with 字段一样,您实际上不需要配对数组。它作为备份。所以,没问题。确保单个文档小于 1mb。相信我,你永远不会超过 200kb。
  • 云函数也是异步构建的。因此,无论有多少用户同时配对,它都会一一完成所有的事情。
  • 这样做... const newUser:String = snap.data().name; let ref = firestore.collection('pairing_system').doc('data'); await ref.update({ waiting: admin.firestore.FieldValue.arrayUnion(newUser) }); ... 我将新用户插入到数组中。如何获取实际长度并从数组中提取一对用户?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
相关资源
最近更新 更多