在 firebase year/month/day 嵌套中查询特定 ID

Query specific ID's in a firebase year/month/day nest

我在 firebase 中有一些数据结构如下所示。我的客户端是用 angularjs + angularfire 构建的。

'all_records' 像这样嵌套以拆分数据,而且大多数查询都是面向时间的。

'all_records'嵌套等于:all_records>年>月>日>记录。

我想将记录与发布记录的用户相关联,因此在创建记录时已将关联 ID 保存到 'my_records' 中的用户。

这个例子显然是一个非常小的数据集,但是为了允许可扩展性和可能拥有数十万条记录,什么是查询 'all_records' 以仅获取用户 'my_records' 的最佳方式.

谢谢

all_records : {

    2015 : {
        2 : {
            3: {
                -JgJJaLaL7LuuRL_IO7c : {
                    data: big data;
                },
                -JgJfaOsyfZe_mZPTApA : {
                    data: lots of data;
                },
                ...
            },
            ...
        },
        1 : {
            28 : {
                -JgJJaLaL7kddEl_ddfE : {
                    data: some more data;
                }
            },
            27 : {
                -JgJfadkdjEk_mZPTApA : {
                    data: even more;
                }
            },
            ...

        },
        ...
    },

    2014 : {
        12 : {
            24: {
                -JgJmnvkFdqc_y63lqcv : {
                    data: decemeber data;
                },
                -JgK6xbXY_E58lshaiVa : {
                    data: and a bit more data;
                }
            },
            ...
        },
        11 : {
            ...
        },
        ...
    }
}

user: {
    name : James,
    my_records : {
        -JgK6xbXY_E58lshaiVa: true,
        -JgJJaLaL7LuuRL_IO7c: true
    }
}

您的用户 my_records 目前没有足够的信息直接映射到记录。您需要在信息中添加日期(年月日)以允许直接查找。

我会以不同的方式构建事物:

  1. 仅包含记录及其 push 生成的 -J 键的列表
  2. 用户列表,参考他们的记录
  3. 一个 list/tree 个日期,并引用每个日期的记录

您的应用程序应该从不 尝试加载所有记录的列表 (#1)。相反,它应该加载相关用户(来自#2)或来自(#3)的相关日期,然后加载从那里引用的记录。

all_records : {
    -JgJJaLaL7LuuRL_IO7c : { data: big data; },
    -JgJfaOsyfZe_mZPTApA : { data: lots of data; },
    -JgJJaLaL7kddEl_ddfE : { data: some more data; }
    -JgJfadkdjEk_mZPTApA : { data: even more; }
}

dates: {
    2015 : {
        2 : {
            3: {
                -JgJJaLaL7LuuRL_IO7c : true,
                -JgJfaOsyfZe_mZPTApA : true,
                ...
            },
            ...
        },
        1 : {
            28 : {
                -JgJJaLaL7kddEl_ddfE : true
            },
            27 : {
                -JgJfadkdjEk_mZPTApA : true
            },
            ...
        },
        ...
    }
}

user: {
    name : James,
    my_records : {
        -JgK6xbXY_E58lshaiVa: true,
        -JgJJaLaL7LuuRL_IO7c: true
    }
}

您可能还想考虑将日期结构化为一个简单的列表,而不是树:

dates: {
    20150203: {
        -JgJJaLaL7LuuRL_IO7c : true,
        -JgJfaOsyfZe_mZPTApA : true,
        ...
    },
    20150128 : {
        -JgJJaLaL7kddEl_ddfE : true
    },
    20150127 : {
        -JgJfadkdjEk_mZPTApA : true
    },
}

虽然为日期构建一棵树很诱人,但我怀疑您是否会从中受益匪浅。上面的结构比较简单,可以进行更广泛的查询,比如"give me all dates in Q1 of 2015":ref.child('dates').startAt('20150101').endAt('20150331').