Самый понравившийся товар за последние 7 дней? - PullRequest
0 голосов
/ 05 июня 2019

Я использую 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. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 05 июня 2019
    let mostLiked = bleatsRef
        .whereField("isReported", isEqualTo: false)
        .whereField("timestamp", isGreaterThanOrEqualTo: startDateStamp)
        .order(by: "likeCount", descending: true)
        .limit(1)

    mostLiked.getDocuments { (snapshot, error) in
        guard
            error == nil, 
            let snap = snapshot 
            else { return }

        print("The most liked document is: \(snap.documents.first)")
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...