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

我正在按时间戳查询文档,它返回一个空数组。但是,当我使用"=="时它有效,例如:.where('date', '==',timestamp),并在我使用'>=''<='时返回空数组。

我也尝试将时间戳转换为日期对象和字符串,但没有成功。

注意:firestore 中的日期字段是Timestamp类型。

我正在查询集合中日期大于“2018-08-03”的文档。

下面是交易集合(左)和文档(右)的图片,它们应该是返回的文档数组的一部分,因为日期大于“2018-08-03”

http://img2.mukewang.com/617b8da10001227910540403.jpg

下面是我的代码。


  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));

预期结果:应该是一个交易日期大于上面指定的数组。


实际结果:空数组。

由于它为相等==工作,我认为>=<=会工作。我在这里缺少什么吗?



潇潇雨雨
浏览 162回答 3
3回答

狐的传说

所以我正在测试它,我认为这是一个与你所展示的非常相似的设置,我实际上能够重现相同的行为。在测试了不同的可能性后,我发现我的问题与字段的数据类型无关,而是与复合索引的配置有关。使此查询工作所需的复合索引配置如下:根据文档的复合索引支持的查询部分,这些类型的复合查询的索引应该首先具有相等过滤字段,这没有明确说明,但文档中的示例是这样呈现的。让我知道这是否为您解决了问题。

大话西游666

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

拉莫斯之舞

该查询需要一个 COLLECTION_ASC 索引来收集交易和字段日期。那个索引还没有准备好。为什么不按照错误提示创建索引?这可能会从根本上解决您的问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript