在我的应用中,我希望给用户提供自己列出的可能性。举一个简单的例子,想象一下您的标准列表应用。用户可以创建自己的自定义列表,并将所需的内容放入其中。我希望用户能够搜索所有列表以查看其中是否有项目。例如,牛奶既可以在购物清单中,也可以在煎饼食谱中。因此,在此示例中,我想搜索用户创建的所有列表,并获取包含牛奶
的列表的名称。我目前具有这样的Firebase结构:
{
"userLists" : {
"vBbYFkxrj8UTmBiUxKsjNSw8YBs2" : {
"groceryList" : {
"82654829" : {
"amount" : "1",
"objectName" : "Milk"
},
"72819278" : {
"amount" : "1",
"objectName" : "Banana"
},
"83917362" : {
"amount" : "2",
"objectName" : "Apple"
}
},
"pancakeRecipe" : {
"12986530" : {
"amount" : "1",
"objectName" : "Milk"
},
"1087527" : {
"amount" : "1",
"objectName" : "Flour"
},
"10985255" : {
"amount" : "1",
"objectName" : "Egg"
}
},
"To do" : {
"12984762" : {
"objectName" : "Mow lawn"
},
"12984762" : {
"objectName" : "Wash car"
},
"98129854" : {
"objectName" : "Pay bills"
},
}
},
"users" : {
"vBbYFkxrj8UTmBiUxKsjNSw8YBs2" : {
"Address" : "Kings Road 123",
"Email" : "a@a.no",
"Name" : "John Doe",
"Phone" : "11223344"
}
}
答案 0 :(得分:3)
简化列表解决方案是更改结构以匹配所需的查询类型,和/或添加其他结构。这是NoSQL数据库中非常常见的技术。
lists
list_id_0
name: "Grocery List"
list_id_1
name: "Pancake Recipe"
list_id_2
name: "To Do"
object_lists
autoId_0
amount: 1
objectName: "Milk"
list_id: "list_id_0"
autoId_1
amount: 1
objectName: "Banana"
list_id: "list_id_0"
autoId_2
amount: 1
objectName: "Apple"
list_id: "list_id_0"
autoId_3
amount: 1
objectName: "Milk"
list_id: "list_id_1"
autoId_4
amount: 1
objectName: "Flour"
list_id: "list_id_1"
采用这种结构,可以很容易地为Milk的objectName查询所有对象,并且还会告诉您它属于哪个list_id。
您甚至可以为您的对象指定一个ID,然后将其绑定到列表中
objects
object_id_0
name: "Milk"
object_id_1
name: "Flour"
object_id_2
name: "Banana"
lists_of_objects
list_id_0
object_id_0: true
object_id_1: true
然后查询object_id_0为真值的每个列表
哦,但是等等..还有更多!检查一下
objects_and_their_lists
object_id_0
list_id_0: true
list_id_1: true
使用该结构,如果您知道object_id(在这种情况下为牛奶),则可以从该结构中获取object_id_0,并且确切知道它出现在哪个列表中。这样可以完全避免查询,而且非常轻巧。>
答案 1 :(得分:2)
您将必须对所有列表进行线性搜索
搜索每个项目的食品杂货列表,看看是否有任何对象被命名为“牛奶”:82654829是,72819278是,....
在pancakeRecipe中搜索每个项目,以查看是否有任何对象被命名为“牛奶”:
在每个项目中搜索“待办事项”,以查看是否有任何对象被命名为“牛奶”