Я использую Firestore для своего приложения и хотел бы иметь возможность размещать наиболее понравившийся товар в течение последних 7 дней.В идеальном мире вызов будет выглядеть примерно так:
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day], from: Date())
let start = calendar.date(from: components)!
let startDate = calendar.date(byAdding: .day, value: -7, to: start)!
let startDateStamp: Timestamp = Timestamp(date: startDate)
let mostLiked = colRef
.whereField("isReported", isEqualTo: false)
.whereField("timestamp", isGreaterThanOrEqualTo: startDateStamp)
.order(by: "likeCount", descending: true)
.limit(to: 1)
mostLiked.getDocuments { (snapshot, error) in
if let error = error { return }
guard let snap = snapshot else { return }
for document in snap.documents {
let data = document.data()
print(data)
}
}
Но это явно недопустимо.
Я получил:
let calendar = Calendar.current
let components = calendar.dateComponents([.year, .month, .day], from: Date())
let start = calendar.date(from: components)!
let startDate = calendar.date(byAdding: .day, value: -7, to: start)!
let startDateStamp: Timestamp = Timestamp(date: startDate)
let mostLiked = colRef
.whereField("isReported", isEqualTo: false)
.whereField("timestamp", isGreaterThanOrEqualTo: startDateStamp)
.order(by: "timestamp", descending: true)
mostLiked.getDocuments { (snapshot, error) in
if let error = error { return }
guard let snap = snapshot else { return }
for document in snap.documents {
let data = document.data()
...
data handling code to fill struct - newTopItem
...
if self.topLikedArray.isEmpty {
self.topLikedArray.append(newTopItem)
} else {
if likeCount > self.topLikedArray[0].likeCount! {
self.topLikedArray.removeAll()
self.topLikedArray.append(newTopItem)
}
}
}
print("Top Item: \(self.topLikedArray)")
}
, который выбирает все за последние 7 дней, и мне придется вручную отсортировать, чтобы получить максимум likeCount, который кажется немного неуклюжимне говоря уже о проблеме масштабируемости, поскольку я не могу ограничить результаты только 1. Есть ли лучший способ сделать это?