我目前正在创建一个管理员应该可以标记图片的应用。访问者可以搜索标签,并查看具有该标签的图像。
一张图片可以有多个标签。这表示我目前如何设置数据:
Images: {
PUSH_ID: {
url: "https://cdn.filestackcontent.com/o0ze07FlQjabT9nuteaE",
tags: {
PUSH_ID: {
tag: "1324"
},
PUSH_ID: {
tag: "4321"
}
}
}
}
当访问者搜索标记时,我需要能够查询标记,并找到具有给定标记的图像的URL。我当时认为有些事情可行:
ref.orderByChild('tags/tag').equalTo(tag).once("value"...)
但经过一些阅读后,我发现您只能在Firebase中深入查询一个级别。
如果是这种情况,我需要重构我的数据,但我无法弄清楚它应该如何构建。
任何人都可以帮助我吗?
顺便说一句;我被告知我应该使用像Elasticsearch这样的东西来查询Firebase,但是这个应用程序适用于流量有限的事件。
谢谢!
答案 0 :(得分:3)
在Firebase(以及大多数NoSQL数据库)中建模数据时,您需要为应用程序想要使用它的方式建模数据。
例如:
"tag1234": true
我从你的模特改变了一些东西:
model.js
格式存储代码,这样可以防止图像多次使用相同的标记进行标记。每当您觉得需要对要执行contains()操作的数组时,请考虑使用这种类似于集合的方法。我们基本上复制了一些数据(标签存储了两次),以确保我们可以通过两种方式查看信息。如果您有更多方法可以访问数据,则可能需要进行更多复制。这在NoSQL数据库中是正常的,并且是它们扩展得如此之好的部分原因。
我强烈建议您在NoSQL data modeling上阅读这篇文章。
答案 1 :(得分:2)
这个结构中有一个像这样的标签节点,不是吗?
Tags: {
"tag1324": {
tagName: pets
},
"tag4321": {
tagName: daffodil
}
"tag5678": {
tagName: tasmanian wolf
}