Вопрос немного расплывчат, но первая проблема заключается в использовании имени события в качестве идентификатора документа (ключа) для события. Хотя на первый взгляд это кажется хорошей идеей, в конечном итоге ее будет сложно поддерживать и трудно изменить, потому что documentID (ключи) не могут быть изменены. Например, если вы назвали событие
Forth Of July Big Bash
и через несколько дней вы решаете изменить его на
Forth Of July Big Bash 2019
Ты не можешь. Вам придется прочитать в узле, удалить существующий узел и переписать его. Кроме того, каждое другое место в вашей базе данных, которое ссылается на этот узел, также должно быть прочитано, удалено и прочитано обратно.
Одна гибкая опция - это структура
Events //collection
document_0 //a document within the collection
event_name: "My Event"
num_people: 10
event_date: "20190704"
registration //a collection
doc_0:
email: some email
doc_1:
email: another email
Теперь вы можете изменить имя события и будет намного лучше для запросов. Часто хорошей идеей является отключение идентификаторов документов от содержащихся в них данных.
Теперь, чтобы ответить на вопрос;
Все документы Firestore имеют идентификатор документа, который используется для уникальной идентификации одного документа из другого. При чтении в событиях вы хотите отслеживать этот идентификатор документа в классе или структуре вместе с остальными полями.
Например - предположим, у нас есть события, хранящиеся в нашем Firestore с вышеуказанной структурой, и они отображаются в табличном представлении. У вас может быть класс, который хранит каждое событие при его чтении из Firestore, и массив var class, который используется в качестве источника данных для вашего tableView.
class EventClass { //this is the class that holds the events for the array
var eventDocumentId = ""
var eventName = ""
var eventDate = ""
var numPeople = ""
}
class ViewController: NSViewController {
var myEventArray = [EventClass]()
func createEvent() {
let eventCollection = self.db.collection("Events")
let eventName = "July 4th Big Bash"
let eventDate = "20190704"
let numPeople = "10"
let eventDict = [
"event_name": eventName,
"event_date": eventDate,
"num_people": numPeople
]
//if there's an observer for the Event collection, this would fire
// passing in this event so an EventClass could be created
// and then added to the tableView dataSource.
eventCollection.addDocument(data: eventDict)
}
func readEvents() {
//Read events and populate the myEventArray with EventClasses
//As each event is read in, create an EventClass and populate it
// from the Firestore fields and also it's .documentID
}
func addAttendee() {
let email = "test@thing.com" //attendee email address
let docId = "cP3lXY5htLRqMGDZckv5" //get the documentID of the tapped event
let eventCollection = self.db.collection("Events")
let eventRef = eventCollection.document(docId)
let registrationRef = eventRef.collection("registration")
let dict = [
"email":email
]
registrationRef.addDocument(data: dict)
}
Общая концепция заключается в том, что когда пользователь нажимает на строку 3 в tableView, ваше приложение реагирует на это, читая элемент в массиве dataSource в строке 3, который будет EventClass. Оттуда получите documentID из этого EventClass и добавьте участника в Firestore.