问题标签 [firebase-realtime-database]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
342 浏览

javascript - 在firebase中结构化数据

我最近开始使用 Firebase。但是,由于我不熟悉 NoSQL 数据库,因此在构建它时遇到了一些麻烦。

我正在开发一个时间表应用程序,几个用户可以输入他们每天上班的开始和结束时间,并将其保存到数据库中。

目前我的火力基地的结构是这样的:

http://imgur.com/tnojU8x

但是,我在我的应用程序中访问这些数据时遇到了一些问题。最重要的是,这感觉不对。首先,我只想在每次用户输入内容时在“时间表”下添加一个新条目,但显然,我也不希望用户能够在一天内添加 2 个条目。

我知道可能有一些复杂的方法可以阻止用户这样做,但我觉得如果我刚刚看到我应该如何最好地构建这个数据库,这一切都可以用更简单的方式解决。

稍后,我想循环浏览当前月份的所有日期,以便特定用户在表格中向他显示​​该月每一天的所有开始/结束时间。

更新:我正在考虑对我的数据库进行非规范化,但这真的有帮助吗?

0 投票
1 回答
1091 浏览

angularjs - Angularfire - Firebase 查询/同步文档中的前 x 个项目

我刚刚开始使用firebase。我有一个由 id 索引的 6 条记录的文档。我想查询和同步列表中的前 3 个项目。

这提供了列表中的最后 3 个项目。不是我想要的。

所以要获得前3 个项目,我认为这会起作用,但它打破了......

我的数据结构:

HTML 视图:

0 投票
2 回答
5162 浏览

firebase - 坚持为我的 firebase 数据库设计架构

我来自 SQL 背景,所以我在设计 NoSQL firebase 架构时遇到了问题。我习惯于使用“WHERE”子句查询任何内容,而在 firebase 中这样做似乎更困难(尽管性能很容易弥补它!)。

我正在为歌曲存储“轨道”对象。这些对象具有键/值对,例如艺术家名称、曲目标题、流派、评级、创建日期等,如下所示:

我网站上的默认行为是列出所有这些曲目,最新添加的曲目出现在列表顶部。我可以将我的 $priority 设置为要创建,然后将其变为负数(已创建 * -1)以实现我相信的这种效果。

但在未来,我希望能够通过其他方式过滤/查询列表,例如:

  • 检索具有摇滚、流行或嘻哈流派的所有曲目。

  • 检索评分为 80 或更高且在过去 7 天内添加的所有曲目。

如何在firebase中实现这一点?我的理解是,实际上只有两种方式来订购数据:

  1. 通过“ID”值,它具有“firebaseURL.firebaseio.com/tracks/id”的物理位置,在我的情况下,当我添加轨道时,它会自动为我选择。这没关系(我认为),因为我有用于列出详细信息的各个跟踪页面的页面,并且我网站上的 URL 类似于“www.mysite.com/tracks/-JPl1zwOzjqoM8xDTFll”。

  2. 通过使用 $priority,在我的例子中,我使用了“created”值,以便按正确的日期顺序排列我的列表。

鉴于我设置的方式(如果有更好的方法,请告诉我),有没有一种方法可以轻松查询特定类型或特定评级?

我读了博客“非规范化你的数据是正常的”(https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html),我想我明白了。根据 Anant 的描述,实现我想要的一种方法可能是在 firebase 中为一个流派创建一个新对象并列出那里的所有曲目,如下所示:

博客中的前提是硬盘空间很便宜,但用户的时间却不是。因此,存在重复数据是可以的,因为它允许更快的读取。

这是有道理的,我不介意这种方法。但这只有在用户只想从一种流派中选择所有曲目时才有效。如果他们想从摇滚和流行音乐中获取所有曲目怎么办?每次有人提交任一类型的歌曲时,我是否必须存储另一个名为 Rock&Pop 的对象并在其中存储一首曲目?

此外,存储整个轨道对象或仅使用 trackid 的引用是否更有意义?例如,在 /genre/pop 下:

两种方法之间有性能差异吗?我在想也许后者会更快,因为我不需要查询每个单独的曲目以获取其他详细信息,但我只是想确定一下。

我已经多次重做我的 firebase 架构。我做了一些改进,但是随着我的应用程序变得越来越大,更改它变得更加昂贵并且消耗更多时间。如果我能在花大量时间重做其余代码以再次匹配之前最后一次解决这些问题,那就太好了。

感谢您对此的任何帮助,非常感谢。如果您需要更多信息,请告诉我。

0 投票
2 回答
15705 浏览

ios - Firebase 持久化,清除 Firebase 缓存

我的应用使用 Firebase 同步和恢复数据。我使用该setValue:withCompletionBlock:方法插入、更新和删除 Firebase 对象。每当有 CoreData 保存时都会调用此方法,从而将我的所有本地更改同步到 Firebase

现在同步会将所有本地数据上传到 firebase,而 restore 会将本地数据替换为 firebase 数据。

我观察FEventTypeValue并使用它FDataSnapshot从 Firebase 获取数据并恢复本地数据。

所以一切对我来说都很完美,直到我设置persistence为 Firebase。

现在什么时候persistence打开,当我更新时,说在 Firebase 中插入一个对象,然后恢复,恢复插入之前的数据。即新插入的对象不会被恢复。但是,如果我再次恢复,则插入的对象将被恢复。删除对象时也会发生同样的事情。删除的对象在我第一次恢复时重新出现,在我再次恢复时消失。我可以看到 Firebase 对象已通过 Firebase 数据视图正确插入和/或删除。

我不确定我在这里做错了什么。我只有在恢复时才有问题。我认为 Firebase 缓存导致了这个恢复问题。我正在考虑在恢复之前清除 Firebase 缓存。我的问题是

  1. 在恢复之前清除缓存是一种好方法吗?
  2. 如果是,如何清除 Firebase 缓存?
  3. 如果没有,你能建议我恢复数据的最佳方法吗?
0 投票
1 回答
230 浏览

angularjs - 如何使用 angularFire 在 Firebase 中查询?

我在 Firebase 中有一个简单的结构:

例如,我需要列出所有具有“subcateria1:true”的“locais”。我不知道该怎么做,因为它需要“localId”,但在查询中我不知道 localId。我只想要属于 subcategoria1 的所有“位置”。

我正在使用 AngularFire。

0 投票
4 回答
15995 浏览

firebase - 安全规则中的 Firebase 速率限制?

我启动了我的第一个开放存储库项目EphChat,人们立即开始向它发出大量请求。

Firebase 是否有办法在安全规则中对请求进行速率限制?我认为有一种方法可以使用请求时间和先前写入数据的时间来完成,但在文档中找不到任何关于我将如何执行此操作的内容。

当前的安全规则如下。

我想对整个 Rooms 对象对数据库的写入(和读取?)进行速率限制,因此每秒只能发出 1 个请求(例如)。

0 投票
0 回答
419 浏览

firebase - 如何为用户输入的作为记录的子字符串/部分的搜索词构建 Firebase 数据?

我将通过包含现有(和有用的)firebase 数据结构引用来作为开头:

https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

在 Firebase 上构建数据的最佳方式是什么?

Firebase 数据结构和 url

然而,我正在寻找的是与 MySQL 的 WHERE LIKE 更同义的东西,即返回包含给定子字符串的记录的能力。

具体来说,我想为用户提供一种方法来搜索应用程序的所有(公共)用户(按用户名/姓名/电子邮件/电话/所有这些)。

我不想下载所有用户,然后使用角度过滤器/替代客户端过滤,因为随着用户群的扩展,这可能会变成大量下载(特别是如果搜索跨越多个集合 - 例如用户名、姓名、电子邮件等)。 )

我考虑过使用树结构,例如:

然后我可以在用户输入“a”时引用用户/用户名/a,用户/用户名/a/an 输入“an”等,并且有效地仅根据搜索词引用用户的子集。

考虑到 NoSQL 的性质,以及非规范化数据和保持结构平坦的建议,这种结构有意义吗?

或者,是否有替代/更好的方法来进行 LIKE esque 查询?

0 投票
2 回答
9623 浏览

algorithm - Firebase:如何在游戏中匹配对手?

我正在实施一个社交国际象棋游戏。每个用户都可以创建一个新游戏,他们会等到系统为他们找到对手。

当用户创建游戏时,他们会指定约束:他们想玩的颜色,以及对手的最低国际象棋等级。

对手可以匹配也可以不匹配。例如,以下两个对手将匹配:

因此,如果用户 1 是系统中的第一个用户并创建了他们的游戏,他们将等待。一旦用户 2 创建了他们的游戏,他们应该立即与用户 1 匹配。

另一方面,下面的两个对手不会匹配,因为他们都想打白。在这种情况下,两者都应该等到其他人使用color: 'black'(或未指定颜色)创建游戏,并且minRating这将符合要求。

我的担忧与成千上万的用户同时创建新游戏的场景有关。如何确保在不造成僵局的情况下匹配对手?即当用户 1、用户 2 和用户 3 试图同时寻找对手并且他们的匹配算法返回用户 99 时,如何防止出现这种情况。如何从这种情况中恢复,仅将用户 99 分配给其中一个他们?

您将如何使用 Firebase 的强大功能来实现这样的匹配系统?

0 投票
1 回答
856 浏览

firebase - 如何在firebase中实现“NOT IN”?

我有一个对象数据集,例如汽车。我想制作一个系统,向用户展示一个对象,并且可以决定他们是否喜欢这辆车。但是,我只想向他们展示每辆车一次。

给定一些用户,例如 user1,我如何从用户已经看过的 allCars、WHITOUT 汽车中进行选择?在 SQL 中,我会执行类似“WHERE carId NOT IN (car123, car234, car321)”的操作

知道如何在 firebase 中执行此操作(无需在客户端进行过滤,我知道该怎么做)...?任何可能的结构,使用某种索引。?我挣扎了一段时间,但没有找到解决办法。

0 投票
2 回答
16592 浏览

angularjs - 如何防止 Firebase 中出现重复的用户属性?

FirebaseSimpleLogin用来创建用户和处理身份验证。

当我尝试通过该方法通过简单登录创建新用户时$createUser(),如果电子邮件地址已被使用,firebase 将不会创建用户。但是,在$set()创建用户并用作密钥后,我还用于将创建的用户保存到我的 firebaseuser.uid中。当尝试写入数据库时​​,即使用户名不是唯一的,firebase 也会保存记录,因为简单登录只需要电子邮件和密码。那么,当用户名不被用作用户对象的键时,如何验证用户名是唯一的呢?

我正在创建这样的新用户:

我的用户对象如下所示:

我需要使用 uid 作为每个用户的键,但我仍然需要用户名是唯一的。

如果一个对象中的属性不是另一个对象中的属性所独有的,我该如何防止 firebase 保存记录?