【问题标题】:Increment date and batch create Firestore documents递增日期和批量创建 Firestore 文档
【发布时间】:2019-11-17 19:45:30
【问题描述】:

我有一张数据地图:

{
    name: name,
    time: <epoch in seconds>,
}

我的目标是在 Firestore 中使用这些数据创建 6 个文档,但是对于每个文档,time 字段应该增加 1 周。因此,如果我的初始时间是 2019 年 11 月 17 日星期日,那么应该有 6 个带有 time 的文档(作为 Firestore 时间戳)2019 年 11 月 17 日星期日、2019 年 11 月 24 日星期日、2019 年 12 月 1 日星期日等。

我正在使用 https 云功能并尝试这样做:

var name = 'test';
var time = 1573992000; // 7 AM EST on Sun, Nov 17 2019
var data = {
    name: name,
    time: time,
};

var start = new Date(time * 1000); // convert to milliseconds

var i;
for (i = 0; i < 6; i++) {
    var ref = db.collection('shifts').doc();

    start.setDate(new Date(start) + 7);

    data['time'] = new admin.firestore.Timestamp(start.getTime() / 1000, 0);

    batch.set(ref, data);
}

return batch.commit();

但所有文档都以相同的时间出现在 Firestore 中(最初的 6 周后)。我的猜测是批次只设置了最新值。我怎样才能避免这种情况而不必创建 6 个单独的地图?

【问题讨论】:

    标签: javascript node.js google-cloud-firestore google-cloud-functions


    【解决方案1】:

    在我看来,您对 Date 的使用总体上是不正确的。

    setDate() 将月份的日期设置为确切的值,如果需要容纳超出月份允许的值(也就是说,如果超过 32,则不会增加月份)永远接受)。

    这对我来说也没有意义:new Date(start) + 7。您不能简单地将 7 添加到日期对象。看起来您可能打算将 7 添加到日期中表示的月份的日期。但同样,如果给定月份的值太高,那将不会按您预期的方式工作。

    考虑到所有因素,Date 对象在这里不会对您有太大帮助。我建议只对整数进行日期数学运算。例如,如果您的开始时间是:

    var time = 1573992000
    

    您可以像这样添加 7 天的秒数:

    time + (7 * 24 * 60 * 60)
    

    这应该更容易使用。

    【讨论】:

    • 是的,我意识到了这一点并改变了它。你知道如何处理 batch.set 吗?
    • 没有什么特别需要处理的。如果您更改了代码,请编辑问题以显示现在无法按您预期的方式运行的代码。
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多