【问题标题】:Query Firestore documents by lowest number of viewcount按最低查看次数查询 Firestore 文档
【发布时间】:2021-11-24 19:42:20
【问题描述】:

我正在尝试从我的 firestore 数据库中查询一组 5 条记录。每次客户端成功查询 5 条记录时,文档上每条记录的视图字段都会递增 1。我基本上希望数据库中的所有记录在客户端都有相同的机会被看到,因此应该查询视图值最低的记录.但是,即使查询的记录现在具有更高的视图值,以下查询的行为仍不如预期,因为我一直获得相同的记录集。降序设置为 false 的 orderBy 不会对集合进行排序以首先列出最低值吗?

QuerySnapshot snapshot = await FirebaseFirestore.instance
    .collection('records')
    .where('city', isEqualTo: city)
    .where('views', isGreaterThan: -1)
    .orderBy('views', descending: false)
    .limit(5)
    .get();

snapshot.docs.forEach((element) async {
  Record record =
      Record.fromMap(element.data() as Map<String, dynamic>);

    await FirebaseFirestore.instance
        .collection('records')
        .doc(record.recordID)
        .update({'views': FieldValue.increment(1)});
  }
}

第一次查询后的文档ID和查看日志:

  • I/颤振(3630):e56a4c40-40e5-11ec-9a4b-b5164e53b334
  • I/颤动(3630):4
  • I/颤振(3630):ecd328c0-40e6-11ec-a76a-cd0a98374153
  • I/颤动(3630):4
  • I/颤振 (3630): dc894420-40e3-11ec-a113-2d0055afb86b
  • I/颤动(3630):4
  • I/颤振(3630):e3f554f0-40e4-11ec-a3ae-1f948418cef9
  • I/颤动(3630):4

文档日志和查看第二个查询:

  • I/颤振(3630):ecd328c0-40e6-11ec-a76a-cd0a98374153
  • I/颤动(3630):5
  • I/颤振(3630):e56a4c40-40e5-11ec-9a4b-b5164e53b334
  • I/颤动(3630):5
  • I/颤振 (3630): dc894420-40e3-11ec-a113-2d0055afb86b
  • I/颤动(3630):5
  • I/颤振(3630):e3f554f0-40e4-11ec-a3ae-1f948418cef9
  • I/颤动(3630):5

【问题讨论】:

  • 您的代码中没有任何内容会增加 views 字段,因此很难说这是否正确。您能否将您的问题编辑为:1) 记录文档 ID 和每个结果的 views 字段值,2) 显示返回的文档之一的屏幕截图?
  • 嗨弗兰克,视图按预期增加。我发布了 Firestore 数据库的屏幕截图。
  • 请在我的评论中加入#1。
  • 已更新,不确定编辑是否是您要查找的内容。数据库中有视图值为 0、1 等的文档,但它们没有被查询。所有的城市字段都是相同的,所以这不是问题。
  • 与 Firestore firebase.google.com/docs/firestore/query-data/… 中的复合查询无关?

标签: firebase flutter google-cloud-firestore


【解决方案1】:

我不确定是什么解释了这种行为,但如果您删除 orderBy 之后的降序参数,它会起作用。我不确定为什么descending 参数会导致问题。

orderBy('views') 默认为 false,如果未提供任何内容,则降序参数。

【讨论】:

    【解决方案2】:

    看看https://www.npmjs.com/package/firebase-firestore-helpergetBy函数中的orderBy prop

    您应该能够执行以下操作:

    db.getBy({ where: [{ city }, ['views' '>', -1]], orderBy: ['views', 'desc'] });
    

    然后,在您的代码中,获取前 5 个。

    我对此不是 100% 确定,但 limitorderBy 之前执行。

    这是一个问题,因为,据我记得(我可能错了),Firebase 会这样工作:

    • 首先,获取所有视图 > -1
    • 然后,只获取前 5 个元素
    • 最后,对生成的 5 个元素进行排序并检索它们。

    再次重申:我不是 100% 确定这一点,但我记得和你有同样的问题。

    如果有人说我错了,我会删除这个答案。

    在这里检查https://firebase.google.com/docs/firestore/query-data/order-limit-data

    免责声明:我是这个库的创建者。它有助于在 Firebase Firestore 中操作对象(并添加缓存)

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 2018-05-24
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多