为了账号安全,请及时绑定邮箱和手机立即绑定

通过时间戳查询firestore中的数据

通过时间戳查询firestore中的数据

潇潇雨雨 2021-10-29 13:58:36
我正在按时间戳查询文档,它返回一个空数组。但是,当我使用"=="时它有效,例如:.where('date', '==',timestamp),并在我使用'>='或'<='时返回空数组。我也尝试将时间戳转换为日期对象和字符串,但没有成功。注意:firestore 中的日期字段是Timestamp类型。我正在查询集合中日期大于“2018-08-03”的文档。下面是交易集合(左)和文档(右)的图片,它们应该是返回的文档数组的一部分,因为日期大于“2018-08-03”下面是我的代码。  const firstDay = new Date('2018-08-03');  const timestamp1 = admin.firestore.Timestamp.fromDate(firstDay);  const trans = [];  const docRef = db.collection('Users').doc(uid).collection('transactions').where('item_id', '==', item_id)    .where('date', '>=', timestamp1);  await docRef.get()    .then((snapshot) => {      snapshot.forEach((doc) => {        trans.push({ transaction_id: doc.id, transaction: doc.data() });      });    })    .catch(err => new Error('cannot get the documents', err));预期结果:应该是一个交易日期大于上面指定的数组。实际结果:空数组。由于它为相等==工作,我认为>=和<=会工作。我在这里缺少什么吗?
查看完整描述

3 回答

?
狐的传说

TA贡献1804条经验 获得超3个赞

所以我正在测试它,我认为这是一个与你所展示的非常相似的设置,我实际上能够重现相同的行为。

在测试了不同的可能性后,我发现我的问题与字段的数据类型无关,而是与复合索引配置有关

使此查询工作所需的复合索引配置如下:

//img1.sycdn.imooc.com//617b8db50001612206020158.jpg

根据文档的复合索引支持查询部分,这些类型的复合查询的索引应该首先具有相等过滤字段,这没有明确说明,但文档中的示例是这样呈现的。

让我知道这是否为您解决了问题。


查看完整回答
反对 回复 2021-10-29
?
大话西游666

TA贡献1817条经验 获得超14个赞

获取您的日期并转换为 javascript 日期对象。然后在转换后的日期对象上执行 getTime() 它将返回一个数字。然后获取 firestore 时间戳并执行 getSeconds()。将 firestore 时间戳的秒值与 getTime() 的变量存储输出进行比较。


查看完整回答
反对 回复 2021-10-29
?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

该查询需要一个 COLLECTION_ASC 索引来收集交易和字段日期。那个索引还没有准备好。

为什么不按照错误提示创建索引?这可能会从根本上解决您的问题。


查看完整回答
反对 回复 2021-10-29
  • 3 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信