- Какой наиболее эффективный способ отслеживать статус чтения без чрезмерных операций записи? ?
- Следует ли мне создать отдельную коллекцию для статуса чтения?
- Есть ли более эффективные подходы для обработки этого варианта использования, не выходя за пределы свободной квоты?< /li>
Код: Выделить всё
struct Article {
let id: String
let title: String
let content: String
let isRead: Bool
let timestamp: Date
}
- Платформа: iOS/SwiftUI
- База данных: Firebase Firestore
- Операций записи в день: ~1000–3000
- Ограничения уровня бесплатного пользования вызывают беспокойство
Я подумывал обновить документ статьи напрямую:
Код: Выделить всё
func markAsRead(articleId: String) async throws {
let ref = db.collection("articles").document(articleId)
try await ref.updateData([
"isRead": true,
"readTimestamp": Date()
])
}
- Приложению необходимо отслеживать статус прочитанного/непрочитанного для каждого пользователя.
- Поддержку в автономном режиме было бы неплохо иметь, но это не обязательно.
- Обновление в режиме реального времени не требуется.
Вместо того, чтобы отмечать отдельные статьи как прочитанные, я мог бы хранить только одна временная метка, показывающая, когда пользователь в последний раз просматривал свои статьи:
Код: Выделить всё
// Structure in Firestore
users/{userId}/reading/{deviceId} {
lastReadTimestamp: timestamp
}
// Update timestamp when user reads articles
func updateLastRead(userId: String, deviceId: String) async throws {
let ref = db.collection("users").document(userId)
.collection("reading").document(deviceId)
try await ref.setData([
"lastReadTimestamp": FieldValue.serverTimestamp()
])
}
// Query unread articles
func getUnreadArticles(userId: String, deviceId: String) async throws -> [Article] {
let readingDoc = try await db.collection("users")
.document(userId)
.collection("reading")
.document(deviceId)
.getDocument()
let lastRead = readingDoc.data()?["lastReadTimestamp"] as? Timestamp ?? Timestamp(date: Date(timeIntervalSince1970: 0))
let snapshot = try await db.collection("articles")
.whereField("timestamp", isGreaterThan: lastRead)
.getDocuments()
return snapshot.documents.map { /* mapping logic */ }
}
Только одна операция записи за сеанс чтения вместо маркировки каждой статьи.
Эффективный запрос с использованием сравнения временных меток.
Можно отслеживать статус чтения для каждой статьи. устройство
Хорошо масштабируется при работе с большим количеством статей
Находится в пределах свободной квоты
Будет ли это лучшим решением? Есть ли какие-либо недостатки, которые мне следует учитывать?
Подробнее здесь: https://stackoverflow.com/questions/791 ... ithin-free