2017-10-14 9 views
4

Firebaseの新しいFirestoreに問題があります。Firebase - Firestore - collection.add()でキーを取得

状況:私は部屋を更新する必要があります。私は私が何をしようとしているcollection('room').add(room)


で部屋を作成collection('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

ここでは、生成されたドキュメントを追加する方法と、そのドキュメント自体のプロパティとしてIDを追加する方法について質問していますか? –

答えて

13

一意のIDを持つドキュメントへの参照を作成するのに、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

idをref docのフィールドとして設定することは冗長であることに注意してください。私は 'ref.set({id:ref.id})'ステートメントを参照しています。 – Tom

+0

@Tomこれは、自動逆シリアル化に参加するためにドキュメントの一意のIDが必要な場合に便利です。したがって、オブジェクトIDがオブジェクトのプロパティの1つでなければならないJavaBeanオブジェクトがある場合、そのプロパティがそのオブジェクトに自動的に設定されるように調整されます。これにより、各逆シリアル化のためにそれを行うための余分なコードを書く必要がなくなります。 –

1

は、データベースを追加する前に、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; 
    }