我想更多地了解Firebase中的数组。当前,我将地图存储在数组中,其中地图内的一个字段是position
,我可以在移动应用中使用它在检索时对数组进行排序,并按{{1 }}。
数组按元素排序。如果元素相等,则按长度对数组进行排序。
例如,
position
<[1, 2, 3]
<[1, 2, 3, 1]
。
然后有一节描述了地图的排序方式:
键排序始终进行排序。例如,如果您写
[2]
,则地图将按键排序并另存为{c: "foo", a: "bar", b: "qux"}
。映射字段按键排序,并按键值对进行比较,首先比较键,然后比较值。如果前几个键值对相等,则比较下一个键值对,依此类推。如果两个映射以相同的键值对开头,则考虑映射长度。例如,以下地图以升序排列:
{a: "foo", b: "bar", c: "qux"}
但是后来我在Firestore中尝试了此操作:在上面的示例中,弄乱了地图的顺序,并将它们存储在数组中:
{a: "aaa", b: "baz"}
{a: "foo", b: "bar"}
{a: "foo", b: "bar", c: "qux"}
{a: "foo", b: "baz"}
{b: "aaa", c: "baz"}
{c: "aaa"}
并且在插入Firestore文档时,该数组未排序!虽然键本身确实在单个Map中排序,但是数组中的元素保持相同顺序。
那么当元素是Map时,数组中的排序是否也可以工作?这是我存储在Firestore中的示例:
data= [{"c": "aaa"}, {"a": "aaa", "b": "baz"}, {"a": "foo", "b": "baz"}, {"b": "aaa", "c": "baz"}, {"a": "foo", "b": "bar", "c": "qux"}, {"a": "foo", "b": "bar"}]
我要存储一个名为“ position”的附加字段,并且每次检索时地图的顺序都保持不变。想知道我是否甚至需要存储该字段,否则数据将按照存储顺序进行排序。
答案 0 :(得分:0)
在将数组发布到Firestore之前,您必须对其进行排序。 数组不在RTD或Firestore对象中排序,但是按其键排序。 或在客户端对数组进行排序。
答案 1 :(得分:0)
已向Google提交了一张票,以改进Array类型的文档,而且我认为通过一些烟雾测试可以看出它是有用且准确的。
https://firebase.google.com/docs/firestore/manage-data/data-types
在此处复制粘贴当前版本:
一个数组不能包含另一个数组值作为其元素之一。
在数组中,元素保持分配给它们的位置。对两个或多个数组进行排序时,将根据其元素值对数组进行排序。
比较两个数组时,将比较每个数组的第一个元素。如果第一个元素相等,则比较第二个元素,依此类推,直到找到差异为止。如果一个数组用完了要比较的元素,但在该点之前相等,那么较短的数组将在较长的数组之前排序。
例如,
[1, 2, 3] < [1, 2, 3, 1] < [2]
。数组[2]
具有最大的第一元素值。数组[1, 2, 3]
的元素等于[1, 2, 3, 1]
的前三个元素,但长度较短。
因此,您似乎可以放心地期望元素在Firestore中的顺序,同时也了解添加/删除的影响。