Добавление идентификатора документа документа в его собственный документ Firestore - Swift 4 - PullRequest
0 голосов
/ 22 января 2019

Как мне добавить идентификатор документа, который я только что добавил, в свою базу данных firestore, к указанному документу?

Я хочу сделать это так, чтобы, когда пользователь извлекал объект "езды" ирешив забронировать его, я могу знать, какую конкретную поездку они забронировали.

Проблема, с которой я сталкиваюсь, заключается в том, что вы не можете получить идентификатор документа до тех пор, пока он не будет создан, поэтому единственный способ добавитьДля указанного документа необходимо создать документ, прочитать его идентификатор, а затем отредактировать документ для добавления в идентификатор.В масштабе это создаст вдвое больше обращений к серверу, чем нужно.

Есть ли стандартный способ сделать это?Или простое решение, чтобы узнать, на кого «ездить» пользователь забронировал и отредактировать его соответственно в базе данных?

struct Ride {
    var availableSeats: Int
    var carType: String
    var dateCreated: Timestamp
    var ID: String // How do I implement this?
}


func createRide(ride: Ride, completion: @escaping(_ rideID: String?, _ error: Error?) -> Void) {
    // Firebase setup
    settings.areTimestampsInSnapshotsEnabled = true
    db.settings = settings

    // Add a new document with a generated ID
    var ref: DocumentReference? = nil
    ref = db.collection("rides").addDocument(data: [
        "availableSeats": ride.availableSeats,
        "carType": ride.carType,
        "dateCreated": ride.dateCreated,
        "ID": ride.ID,
    ]) { err in
        if let err = err {
            print("Error adding ride: \(err)")
            completion(nil, err)
        } else {
            print("Ride added with ID: \(ref!.documentID)")
            completion(ref?.documentID, nil)
            // I'd currently have to use this `ref?.documentID` and edit this document immediately after creating. 2 calls to the database.
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Несмотря на то, что ответ идеально подходит, FireStore обладает необходимой вам встроенной функциональностью и не требует двух обращений к базе данных.Фактически, он не требует никаких вызовов к базе данных.

Вот пример

    let testRef = self.db.collection("test_node")
    let someData = [
        "child_key": "child_value"
    ]

    let aDoc = testRef.document() //this creates a document with a documentID
    print(aDoc.documentID) //prints the documentID, no database interaction
    //you could add the documentID to an object etc at this point
    aDoc.setData(someData) //stores the data at that documentID

См. Документацию Добавление документа для получения дополнительной информации.

В некоторых случаях может быть полезно создать ссылку на документ с автоматически сгенерированным идентификатором, а затем использовать ссылку позже.Для этого варианта использования вы можете вызвать doc ():

Возможно, вы захотите рассмотреть немного другой подход.Вы можете получить идентификатор документа в закрытии после записи.Итак, давайте дадим вам классную поездку (класс)

class RideClass {
    var availableSeats: Int
    var carType: String
    var dateCreated: String
    var ID: String

    init(seats: Int, car: String, createdDate: String) {
        self.availableSeats = seats
        self.carType = car
        self.dateCreated = createdDate
        self.ID = ""
    }

    func getRideDict() -> [String: Any] {
        let dict:[String: Any] = [
            "availableSeats": self.availableSeats,
            "carType": self.carType,
            "dateCreated": self.dateCreated
        ]
        return dict
    }
}

, а затем немного кода для создания поездки, выписать ее и использовать автоматически созданный documentID

    var aRide = RideClass(seats: 3, car: "Lincoln", createdDate: "20190122")

    var ref: DocumentReference? = nil
    ref = db.collection("rides").addDocument(data: aRide.getRideDict() ) { err in
        if let err = err {
            print("Error adding document: \(err)")
        } else {
            aRide.ID = ref!.documentID
            print(aRide.ID) //now you can work with the ride and know it's ID
        }
    }
0 голосов
/ 22 января 2019

Я считаю, что если вы используете встроенный генератор идентификаторов Swift, называемый UUID, предоставляемый Foundation Framework, это позволит вам делать то, что вы хотите делать.Пожалуйста, смотрите код ниже для моих рекомендуемых изменений.Также, делая это таким образом, когда вы сначала инициализируете структуру «Ride», вы можете генерировать ее переменную ID, а не делать это внутри функции.Это способ, которым я генерирую уникальные идентификаторы во всех своих приложениях, и это работает отлично!Надеюсь, это поможет!

struct Ride {
    var availableSeats: Int
    var carType: String
    var dateCreated: Timestamp
    var ID: String
}


func createRide(ride: Ride, completion: @escaping(_ rideID: String, _ error: Error?) -> Void) {
    // Firebase setup
    settings.areTimestampsInSnapshotsEnabled = true
    db.settings = settings

    // Add a new document with a generated ID
    var ref: DocumentReference? = nil
    let newDocumentID = UUID().uuidString
    ref = db.collection("rides").document(newDocumentID).setData([
        "availableSeats": ride.availableSeats,
        "carType": ride.carType,
        "dateCreated": ride.dateCreated,
        "ID": newDocumentID,
    ], merge: true) { err in
        if let err = err {
            print("Error adding ride: \(err)")
            completion(nil, err)
        } else {
            print("Ride added with ID: \(newDocumentID)")
            completion(newDocumentID, nil)
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...