我目前在文档查询中使用此 whereField:
.whereField("tags", arrayContainsAny: ["Sports", "Fashion", "Gaming"])
。
其中“tags”字段是一个字符串数组(例如:[“Sports”、“Gaming”]。这非常适合过滤掉任何包含 tag 字段但其中没有 arrayContainsAny 值的文档。我希望能够按 arrayContainsAny 数组内的标签数量对返回的文档进行排序。例如,如果文档的标签字段在 arrayContainsAny 中具有一个值,则该文档的优先级将低于在 arrayContainsAny 中具有两个值的文档,依此类推。逻辑看起来像这样:
documents = documents.sorted { first, second in
let firstNumberOfTagsInFilters = filters.filter { first.tags?.contains($0) ?? false }.count
let secondNumberOfTagsInFilters = filters.filter { second.tags?.contains($0) ?? false }.count
return firstNumberOfTagsInFilters > secondNumberOfTagsInFilters
}
上面的代码块非常适合对返回的文档进行排序。唯一的问题是我在查询中使用分页,因此我无法像这样对文档进行排序,因为我一次只能检索一定数量的文档:
query
.whereField("tags", arrayContainsAny: tags)
.limit(to: count)
.startOptionally(afterDocument: lastDocument)
是否可以在查询本身的限制之前添加此排序功能?如果不是,也许数组不是这些标签的最佳方法,并且可以采用不同的方法?
Firestore 只能对您查询的文档中存在的文字值进行排序/过滤。无法像您尝试的那样对计算值进行排序/过滤。
对于某些用例(例如 Salvino 链接的一个:如何在 firebase firestore 中按数组字段长度排序文档),您可以将计算结果存储在文档本身中,然后对其进行过滤,但对于您的用例来说'仅当您可以计算您想要允许的每个过滤器组合的计数时,d 才起作用 - 这似乎不会超出一小部分标签。
因此,如果这个用例对您的应用程序至关重要,请考虑使用另一个支持它的数据库。