Flutter 将数组传递到Firestore数据库&x27;s orderBy条款?

Flutter 将数组传递到Firestore数据库&x27;s orderBy条款?,flutter,google-cloud-firestore,Flutter,Google Cloud Firestore,假设我的Firestore数据库中的文档表示菜谱,每个文档都有一个“tags”字段,该字段是一个数组,包含该菜谱的标签(例如:辣味、法式、素食) 当用户搜索某些标记时,我使用数组contains any操作符来提取所有配方,这些配方至少包含用户搜索过的一个标记。然后,我根据匹配的标签数量对返回的文档进行排序。例如,如果用户搜索“辣味法国素食者”,则“标签”字段包含所有三个标签的文档将首先出现,然后是“标签”字段包含两个标签的文档,以此类推 我目前正在使用以下工具手动排序: const userS

假设我的Firestore数据库中的文档表示菜谱,每个文档都有一个“tags”字段,该字段是一个数组,包含该菜谱的标签(例如:辣味、法式、素食)

当用户搜索某些标记时,我使用数组contains any操作符来提取所有配方,这些配方至少包含用户搜索过的一个标记。然后,我根据匹配的标签数量对返回的文档进行排序。例如,如果用户搜索“辣味法国素食者”,则“标签”字段包含所有三个标签的文档将首先出现,然后是“标签”字段包含两个标签的文档,以此类推

我目前正在使用以下工具手动排序:

const userSearchedTags: string[] = [...] // array of tags searched for by user

recipes.sort((r1, r2) => {
  const r1Tags: string[] = r1.get('tags');
  const r2Tags: string[] = r2.get('tags');

  const r1TagMatchQuant = r1Tags.filter(r1Tag => userSearchedTags.includes(r1Tag)).length;
  const r2TagMatchQuant = r2Tags.filter(r2Tag => userSearchedTags.includes(r2Tag)).length;

  return r2TagMatchQuant - r1TagMatchQuant;
});
但是我想对这个查询进行分页,这要求它们由Firebase排序,所以我想我可以在查询中使用orderBy子句,这样Firebase就可以按照匹配标记的数量将已经排序的文档返回给我。如果这样做有效,那么我将能够使用startAfter()子句对查询进行分页。我试图这样做:

FirebaseFirestore.instance
  .collection('recipes')
  .where('tags', arrayContainsAny: userSearchedTags)
  .orderBy('tags')
  .get();
但它不会返回按匹配标记数排序的文档。我认为它可能会返回按每个文档上“tags”数组长度排序的文档,但进一步的测试表明它也不会这样做。所以我的问题是,当我将“tags”(一个数组字段)传递给orderBy子句时,Firebase如何对这些文档进行排序


另外,是否有办法让Firebase按照匹配标签的数量将文档返回给我,或者是我现在的方式(在收回至少有一个匹配标签的所有文档后手动排序)唯一的方法是?

返回文档的顺序通常与正在搜索的索引中存在的文档的顺序相同。假设您的标记是字符串,那么根据上的文档:

UTF-8编码字节顺序


所以我希望它是匹配的第一个标记的顺序,而绝对不是您希望匹配的标记的数量。这种基于计算值的结果优先级排序根本不是Firestore查询的目的,因为它需要Firestore在将匹配项返回给您之前重新排序。

谢谢。你打算用什么词来描述订单?“通常”之后似乎缺少一个单词不,它实际上是完整的,只是有点难以解析。我试图澄清,虽然现在有点罗嗦。谢谢澄清。我想确认一下,如果你遇到这个问题,你会按照我当时的方式实施吗?(将至少有一个搜索标记的所有文档拉回来并手动对它们进行排序)不幸的是,这使得分页不可能,因此我要么跳过该功能,要么寻找一种方法来公开该功能,而不意味着对动态计算的值进行排序。如果你需要比FixSt店提供更强大的搜索,考虑使用专用搜索引擎。