【问题标题】:Order by timestamp with range filter on different field Swift Firestore按时间戳排序,在不同字段 Swift Firestore 上使用范围过滤器
【发布时间】:2018-09-24 07:31:45
【问题描述】:

我之前问过这个问题,但还没有找到可行的解决方案。 我想要的是获取一个年龄范围内的用户列表,并按“createdAt”时间戳排序,但由于“生日”范围过滤器,第一个 orderBy 必须在“生日”字段上。

这是我的查询:

database.collection("users")
    .whereField("birthday", isGreaterThan: exploreSettings.upperAgeDate)
    .whereField("birthday", isLessThan: exploreSettings.lowerAgeDate)
    .whereField("isHidden", isEqualTo: false)
    .order(by: "birthday", descending: true)
    .order(by: "createdAt", descending: true)
    .limit(to: 8)
    .start(afterDocument: lastSnapshot)
    .getDocuments {...}

这就是它将返回的内容

[
    ["name": "John", "age": 21, "createdAt": 2005],
    ["name": "Jane", "age": 22, "createdAt": 2003],
    ["name": "Adam", "age": 23, "createdAt": 2004],
    ["name": "Karl", "age": 24, "createdAt": 2001],
    ["name": "Mila", "age": 25, "createdAt": 2002],
]

以及我希望它返回的内容

[
    ["name": "Karl", "age": 24, "createdAt": 2001],
    ["name": "Mila", "age": 25, "createdAt": 2002],
    ["name": "Jane", "age": 22, "createdAt": 2003],
    ["name": "Adam", "age": 23, "createdAt": 2004],
    ["name": "John", "age": 21, "createdAt": 2005],
]

有些人建议我以某种方式将生日和创建时间戳合并到一个字段中,但我知道我应该如何做到这一点

【问题讨论】:

  • 您想使用 createdAt 对数组进行排序吗?
  • 我想填充按 createdAt @AbhirajsinhThakore 排序的数组
  • 我在你的数组里面看到了,createdAt你没有键值对。?这是你的回应。?或者打印时有一些错误。?我可以使用“CreatedAt”键为您排序数组,但前提是在 created at 中只有一个键值对。
  • 抱歉,这是堆栈溢出中的拼写错误。数组只是查询将从 db 获得什么以及 et 应该获得什么的示例。 @AbhirajsinhThakore
  • 添加了带有编辑和输出的答案,请检查它是否适合您。?

标签: swift firebase google-cloud-firestore


【解决方案1】:

试试这个:

      let arrResponse = [
        ["name": "John", "age": 21, "createdAt": 2005],
        ["name": "Jane", "age": 22, "createdAt": 2003],
        ["name": "Adam", "age": 23, "createdAt": 2004],
        ["name": "Karl", "age": 24, "createdAt": 2001],
        ["name": "Mila", "age": 25, "createdAt": 2002],
        ]


    let descriptor : NSSortDescriptor = NSSortDescriptor(key: "createdAt", ascending: true)

    let sortedResult = (arrResponse as NSArray).sortedArray(using: [descriptor])

    print(sortedResult)

输出是这样的:

【讨论】:

  • 是的,这将对数组进行排序,但不是我想要的。我需要使用 firestore 查询直接从数据库中获取某个年龄范围内的最新用户
  • 我的方法是按原样获取数据,然后像这样排序,所以在任何时候你都会得到最新的数据。
  • 这将是一个可行的解决方案,但因为我使用的是限制和分页,所以当我向下滚动时,下一次提取可能包含新用户。
  • 我可以知道您的查询不起作用的原因吗?
  • 因为查询中的“.order(by: "birthday", descending: true)" 行。
猜你喜欢
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多