【发布时间】:2025-12-12 20:30:01
【问题描述】:
我正在尝试使用createdAt 属性从我的集合中获取一个值,该属性是一个时间戳。
这大致是我的查询的样子:
function getDataFromYesterdayToNow (db){
const now = new Date()
const yesterday = new Date(now.setDate(now.getDate() - 1))
yesterday.setHours(0, 0, 0, 0)
const { Timestamp } = firebase.firestore
return db
.collection('myData')
.where('createdAt', '>=', Timestamp.fromDate(yesterday))
.where('createdAt', '<=', Timestamp.fromDate(now))
.get()
}
但是,当我运行它时,我收到以下错误:
错误是“FirebaseError:[code=invalid-argument]:使用无效数据调用的函数 Query.where()。不支持的字段值:自定义 Timestamp 对象。 Stacktrace 是“FirebaseError:使用无效数据调用的函数 Query.where()。不支持的字段值:自定义 Timestamp 对象
我非常困惑,我总是在其他集合中使用 Timestamp 对象来获取,如果我尝试只使用 date 对象,它就不起作用。我是不是忘记了什么?
编辑:根据要求,这是我的文档的示例:
{
name: "My Data Name", // (string)
createdAt: November 9, 2018 at 8:40:45 PM // (Timestamp)
}
【问题讨论】:
-
示例文档记录是什么样的?
-
您的括号与第二个 where 子句(带有
now的那个)不匹配。这只是一个转录错误还是真的在代码中? -
当您可以忽略
createdAt是否小于或等于now时,为什么还要检查它?虽然从逻辑上讲是有道理的,但数据不会存在于now之外,而只会浪费计算时间(和你的钱)。 -
@samthecodingman 添加不改变返回文档数量的任何类型的过滤器不会改变查询的成本。 Cloud Firestore 中的主要计费单位是读取的文档数。这也是查询性能的唯一指标。
-
@theJuls 您应该能够传递 Timestamp 或 Date 对象(将被转换为 Timestamp)。如果这些都不起作用,那么其他事情就很不对劲了。您使用的是什么版本的 SDK?
标签: javascript firebase google-cloud-firestore