【问题标题】:Sort items in descending order by the number of childs count Firebase Realtime Database按子项数降序对项目进行排序 Firebase 实时数据库
【发布时间】:2021-04-26 22:36:57
【问题描述】:

我刚开始使用带有 javascript 的 firebase 数据库,我尝试过这样的排序

db.ref (). Child ('Items'). OrderByChild ('upvotes')

但它并不能正常工作。

我需要按票数对对象进行排序,票数现在计算如下:upvotes.numChildren() - downvotes.numChildren()

我需要按降序对它们进行排序

请告诉我如何按元素的子元素数量排序,或者如果不可能,一些替代方法

【问题讨论】:

  • 你不能。您需要使用 Javascript 反转数组。您可以查看this

标签: javascript firebase sorting firebase-realtime-database


【解决方案1】:

这在 Firebase 查询中是不可能的。您必须获取一次按升序排列的数据,然后将其反转并自己使用 Javascript 进行处理。

const db = firebase.database()
db.ref("posts").once("value").then((snapshot) => {
  const rawData = []
  snapshot.forEach((post) => {
    const postName = post.name
    const upvotes = Object.keys(post.upvotes).length
    const downvotes = Object.keys(post.downvotes).length
    rawData.push({name: postName, upvotes: upvotes, downvotes: downvotes, score: upvotes - downvotes })
  })
  console.log(rawData)
})

现在剩下的唯一部分是您必须根据属性分数对该数组进行排序。

我有几点建议:

  1. 这种数据结构既不理想也不经济。 Firestore 对于结构和查询来说都是一个更好的选择,但是这个现有的结构可以稍微改进一下。
  2. 您的屏幕截图中没有提到名为“.size”的属性。您必须在各自的节点中明确存储赞成票和反对票的计数。然后您就可以在查询中使用.orderByChild("upvotes.size")

如果您需要更多说明,请告诉我。

【讨论】:

  • 非常感谢您的回复!我认为你的回答是正确的。你说这种数据结构不理想也不经济。如果这对您来说并不困难,您能否建议我如何更好地构建我的数据?
【解决方案2】:

您似乎已经达到了 Firebase 不具备的所有优点。幸运的是,它们都有详细记录的解决方法,所以让我们来看看它们:

  1. 没有内置计数功能。如果您想计算赞成票的数量,您要么必须下载所有赞成票,要么将upvoteCount 存储在单个赞成票之外,并在每次投票时更新。在规模上,只有最后一个选项是现实的,因此您最终会得到两个额外的属性:upvotesCountdownvoteCount
  2. 无法查询计算值,例如您的downvoteCount - upvoteCount。如果您想订购某物,则需要将其作为值存储在数据库中,因此我们最终会得到另一个附加属性voteScore,即upvoteCount - downvoteCount
  3. Firebase 始终按升序返回结果。如果您需要按降序显示项目,您有两个选择:要么在客户端反转它们,要么存储一个反转的值并对其进行排序。如果您选择后者,您最终会得到第四个新属性:sortCount = downvoteCount - upvoteCount

有关所有这些的更多信息,请参阅:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多