2017-10-14 71 views
4

我正在面對來自Firebase的新Firestore問題。Firebase - Firestore - 使用collection.add獲取密鑰

情況:我有一個collection('room')

我創造空間與collection('room').add(room)


我想要做的事:我需要更新一個房間。

對於這一點,我用:collection('room').doc(ROOM_ID).update(update)

所以我需要在我的收藏添加ROOM_ID文件中:

|room 
    ROOM_ID 
     id:ROOM_ID, 
     someContent: ForTheQuery 

有沒有一種可能的方式來實現這一目標?

另一種方法是創建自己用生成的ID:

collection('room') 
.doc(someId) 
.set({ 
    id: someId, 
    someContent: ForTheQuery 
}); 

,但我想,以避免它。

+0

我沒有看到您提出的解決方案的問題。你爲什麼不想這樣做? –

+0

因爲我不確定ID的生成功能。我看到每個功能的con和pro,所以我不會用firebase generation iD保持清潔。 – Wandrille

+0

所以你問這裏如何添加一個生成的文件,並將該文件本身的屬性添加爲該文件? –

回答

13

您可以使用doc()創建對具有唯一ID的文檔的引用,但該文檔不會被創建。

const ref = store.collection('users').doc() 
console.log(ref.id) // prints the unique id 
ref.set({id: ref.id}) // sets the contents of the doc using the id 
.then(() => { // fetch the doc again and show its data 
    ref.get().then(doc => { 
     console.log(doc.data()) // prints {id: "the unique id"} 
    }) 
}) 
+1

我認爲應該指出的是,在ref doc中將id設置爲一個字段是重複的。我指的是'ref.set({id:ref.id})'語句。 – Tom

+0

@Tom當需要文檔的唯一ID參與自動反序列化時,它可以派上用場。因此,如果您有一個JavaBean對象,其中doucment ID應該是該對象的屬性之一,則會安排該屬性在該對象中自動設置。這樣可以避免爲每個反序列化編寫額外的代碼。 –

1

獲取ID前加數據庫:然後,您可以通過使用在文檔引用所提供的唯一ID設置文檔的內容

var idBefore = afs.createId(); 
    console.log(idBefore); 
+1

謝謝,這是正確的:他們在文檔中使用它:* https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md* – Wandrille

1

您可以從創建拿到ID通過使用collection.ref.add文件(您的項目不帶ID)和響應(res)將包含使用其中的ID創建的新文檔引用。所以簡單地通過res.id來獲取ID。

createOne(options: { item: any, ref: AngularFirestoreCollection<any> }) { 
    const promise = new Promise((resolve, reject) => { 

     if (options.item) { 
     // Convert object to pure javascript 
     const item = Object.assign({}, options.item); 
     console.log('dataService: createOne: set item: ', item); 

     options.ref.ref.add(item) 
      .then((res) => { 
      console.log('dataService: createOne success: res: ', res); 
      resolve(res); 
      }).catch(err => { 
      console.error('dataService: createOne: error: ', err); 
      reject(err); 
      }); 
     } else { 
     console.log('dataService: createOne: wrong options! options: ', options); 
     reject(); 
     } 
    }) 

    return promise; 
    }