按另一个数组中包含的数组中的最多项目对文档进行排序

问题描述 投票:0回答:1

我目前在文档查询中使用此 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)

是否可以在查询本身的限制之前添加此排序功能?如果不是,也许数组不是这些标签的最佳方法,并且可以采用不同的方法?

swift firebase google-cloud-platform google-cloud-firestore
1个回答
0
投票

Firestore 只能对您查询的文档中存在的文字值进行排序/过滤。无法像您尝试的那样对计算值进行排序/过滤。

对于某些用例(例如 Salvino 链接的一个:如何在 firebase firestore 中按数组字段长度排序文档),您可以将计算结果存储在文档本身中,然后对其进行过滤,但对于您的用例来说'仅当您可以计算您想要允许的每个过滤器组合的计数时,d 才起作用 - 这似乎不会超出一小部分标签。

因此,如果这个用例对您的应用程序至关重要,请考虑使用另一个支持它的数据库。

© www.soinside.com 2019 - 2024. All rights reserved.