Firebase - Firestore - получите ключ с помощью collection.add ()

У меня проблема с новым Firestore от Firebase.

Ситуация: у меня collection('room')

Я создаю комнату с collection('room').add(room)


Что я пытаюсь сделать: мне нужно обновить комнату.

Для этого я использую: collection('room').doc(ROOM_ID).update(update)

Поэтому мне нужно добавить ROOM_ID в документ моей коллекции:

|room
    ROOM_ID
        id:ROOM_ID,
        someContent: ForTheQuery

Есть ли способ добиться этого?

Альтернативой является создание себе сгенерированного идентификатора с помощью:

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

но я хочу избежать этого.


person Wandrille    schedule 14.10.2017    source источник
comment
Я не вижу проблем с предложенным вами решением. Почему ты не хочешь этого сделать?   -  person Doug Stevenson    schedule 14.10.2017
comment
Потому что я не уверен в функции генерации идентификатора. Я вижу плюсы и минусы для каждой функции, поэтому я не буду содержать ее в чистоте с помощью Firebase Generation iD.   -  person Wandrille    schedule 14.10.2017
comment
Итак, вы спрашиваете здесь, как вы можете добавить документ с сгенерированным I, а также добавить этот идентификатор в качестве свойства самого документа?   -  person Doug Stevenson    schedule 14.10.2017
comment
@ Дуг Стивенсон Да, это правильно. И я хочу избежать дублирования ключей. И я полагаю (это может быть совершенно ложным, поправьте меня, если это не так), что Firebase никогда не будет дублировать ключи с некоторыми проверками. Спасибо за вашу заботу.   -  person Wandrille    schedule 14.10.2017


Ответы (4)


Для создания ссылки на документ с уникальным идентификатором, но документ еще не будет создан. Затем вы можете установить содержимое этого документа, используя уникальный идентификатор, указанный в ссылке на документ:

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"}
    })
})
person Doug Stevenson    schedule 14.10.2017
comment
Я думаю, следует отметить, что установка идентификатора в качестве поля в справочной документации излишне. Я имею в виду инструкцию ref.set ({id: ref.id}). - person Tom; 23.11.2017
comment
@Tom это может пригодиться, когда вам нужен уникальный идентификатор документа для участия в автоматической десериализации. Итак, если у вас есть объект JavaBean, в котором идентификатор документа должен быть одним из свойств объекта, это позволит автоматически установить это свойство в этом объекте. Это позволяет избежать написания дополнительного кода для каждой десериализации. - person Doug Stevenson; 01.03.2018
comment
Может ли этот идентификатор использоваться, например, другим параллельным запросом? Как мы можем гарантировать целостность этого идентификатора и этого запроса, который выполняется? Это потокобезопасно? - person LMG; 09.01.2019
comment
@LMGagne Вы можете использовать этот идентификатор как хотите. Безопасность потоков никогда не является проблемой, поскольку существует только одно соединение, и все операции выполняются через него. Не уверен, что вы имеете в виду под честностью. - person Doug Stevenson; 09.01.2019
comment
Могут ли две функции использовать один и тот же идентификатор? В этом случае целостность данных также может быть нарушена. - person LMG; 09.01.2019
comment
@LMGagne Вероятность того, что для документов в одной коллекции будут сгенерированы два идентичных идентификатора, астрономически мала. Если вы беспокоитесь об этом, вы вкладываете свою энергию в неправильные заботы! - person Doug Stevenson; 09.01.2019
comment
Понял. Спасибо! - person LMG; 09.01.2019

ANGULARFIRE:

получить идентификатор перед добавлением базы данных:

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

ВОССТАНОВЛЕНИЕ ANDROID:

String idBefore = db.collection("YourCol").document().getId();
person Diego Venâncio    schedule 06.11.2017
comment
Спасибо, это правильно: они используют его в документе: github.com/angular/angularfire2/blob/master/docs/firestore/ - person Wandrille; 08.11.2017

SDK Firebase Javascript:

Просто используйте .id, чтобы получить ключ, вот пример использования async / await:

  const KEYID = async() => (await fs.collection("testing").add({ data: 'test'})).id;
person Hamed Baatour    schedule 19.02.2019

Вы можете получить идентификатор из созданного документа, используя collection.ref.add (ваш элемент без идентификатора), а ответ (res) будет содержать ссылку на новый документ, созданный с идентификатором внутри него. Так что получите идентификатор, просто выполнив res.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;
  }
person Bjarne Gerhardt-Pedersen    schedule 27.02.2018