为什么我的Firestore文档包装在MAP对象中?

时间:2019-07-14 13:44:26

标签: javascript typescript firebase google-cloud-firestore

在将事件推送到Firestore后,事件ID中的数据被包装在另一个事件(据说是map()对象)中。为什么会这样呢?访问事件时,我必须执行“ event.event.eventProperty”以访问我的信息。第二个事件是在我的数据库中定义的,但未在我的代码中定义,因此会导致错误“事件中不存在事件属性”。

Structure of data on Firestore

Structure of data on Firestore. Uncollapsed version

我试图回溯整个事件创建过程,以查看是否意外将事件推错了。到目前为止,我还没有找到具体的问题。我尝试在代码的各个部分进行console.log(event),结果得到了正确的对象,但是在推送它时,firebase将数据嵌套在另一个事件对象中。 '''     事件界面

    export interface Event {

  event_title?: String, 
  event_location?: String,  
  event_students?: String, 
  event_category?: String, 
  event_date?: String, 

  event_startTime?: String, 
  event_endTime?: String, 
  event_description?: String, 
  event_pictureURL?: String, 
  event_chatNumber?: Number, 
  event_goingCounter?: Number, 
  event_maybeGoingCounter?: Number, 
  event_creation_timeStamp?: Date ,
  event_id?: Number, 
  createdBy?: String,
  lastUpdate?: Number
}

``Firebase数据库服务''

createEvent(event: Event) {
   this.eventCollectionRef.add({

   event

  })
    .then(function() {
    console.log("Event was successfully created!");
})
    .catch(function(error) {
    console.log("Error Creating Event: ", error);
});

}

'tab3(事件创建屏幕)'

createEvent() {
    this.event = {  
    event_title: this.createEventForm.controls["event_title"].value,
    event_location: this.createEventForm.controls["event_location"].value,  
    event_students: this.createEventForm.controls["event_students"].value, 
    event_category: this.createEventForm.controls["event_category"].value, 
    event_date: this.createEventForm.controls["event_date"].value, 
    event_startTime: this.createEventForm.controls["event_startTime"].value, 
    event_endTime: this.createEventForm.controls["event_endTime"].value, 
    event_creation_timeStamp: this.createEventForm.controls["event_creation_timeStamp"].value,
    event_description: this.createEventForm.controls["event_description"].value,
    event_pictureURL: "", 
    event_chatNumber: 0, 
    event_goingCounter: 0, 
    event_maybeGoingCounter: 0,
    createdBy: this.user.uid

  }
    this.FirebaseDatabase.createEvent(this.event)
    this.showToast("Event has been created.");
  }

''``这是我从Firestore检索具有特定ID的事件的地方''

ngOnInit() {
    event: Event;

    this.firebaseDatabase.getEvent(this.id).subscribe( res => {
      this.event = res
      console.log(this.event["event"].event_category)
    })

  }

''GetEvent(id:string)定义''

getEvent(id:string){

return this.eventsCollection.doc<Event>(id).valueChanges().pipe(take(1), map(event => {

    return event

}))

}

错误消息

Error Message on Console

预期:将我的事件对象按原样推送到Firestore。不要嵌套。

实际:事件对象嵌套在地图中。

1 个答案:

答案 0 :(得分:0)

这是因为您调用add(...)的方式。现在您有:

this.eventCollectionRef.add({
   event
})

这是以下内容的简写语法:

this.eventCollectionRef.add({
   event: event
})

所以这就是为什么您在数据库中看到额外的event属性级别的原因。如果您不希望这样做,请删除{}

this.eventCollectionRef.add(event)