Flutter firestore устанавливает данные и получает идентификатор документа

#flutter #google-cloud-firestore

# #flutter #google-облако-firestore

Вопрос:

Я пытаюсь получить вновь созданный документ при публикации нового элемента в firestore.

Я знаю, что есть другие подобные вопросы, и я попробовал их! НО не получаю результат, на который я надеялся.

Итак, по сути, я set набираю кучу данных, а затем делаю doc().id внутри then , и он возвращает идентификатор, которого нет в моем firestore, и он не соответствует ни одному из моих созданных документов.

код:

 return _userRef.doc(_user.uid).collection(collName).doc().set({
      'item_name': name,
      'item_description': description,
      'item_location':
          GeoPoint(_locationData.latitude, _locationData.longitude),
      'item_date': DateTime.now(),
      'item_images': imageMap,
    }).then((value) {   
      print('${_userRef.doc(_user.uid).collection(collName).doc().id}');
    });
 

Я видел другой вопрос, где они это сделали :

  var ref = _userRef
              .doc(_user.uid)
              .collection(collName)
              .get()
              .then((value) => print('hello ***** ${value.docs[0].id}'));
 

но это просто возвращает первый документ в списке документов! Я думал о загрузке одного массива перед set , а затем загрузить 2-й массив после set , а затем просто сравнить 2 массива и найти странного человека. НО это займет очень много времени, если у меня будет огромный список!

Есть мысли??

Ответ №1:

doc() без параметров создает DocumentReference со случайным идентификатором. Если вы хотите узнать этот идентификатор, он немедленно доступен в id свойстве этого объекта. Вы можете получить к нему доступ сразу, не записывая ничего.

 var ref = _userRef.doc(_user.uid).collection(collName).doc();
print(ref.id);
 

Идентификатор генерируется в клиентском приложении, поэтому он доступен сразу. Документ фактически не будет существовать, пока вы не вызовете set() эту ссылку.

 ref.set(...);  // after success, the document will exist
 

Комментарии:

1. спасибо, но я хочу знать, как получить этот вновь созданный документ после набора. тем временем я загрузил массив перед набором, затем я загрузил второй массив после набора, так что теперь у before должен быть тот же список, что и у after, за исключением того, что в массиве after будет на 1 элемент больше, чем в другом, этот 1 элемент — мой недавно созданный документ. Я получил это для работы….

2. Вам нужно будет обычно обращаться к get() документу, используя ту же ссылку. Для этого нет ярлыка. set() не вернет вам новое содержимое документа.

Ответ №2:

Вы можете использовать метод добавления для добавления новых документов в свою коллекцию.

 Firestore.instance.collection(collName).add({
      'item_name': name,
      'item_description': description,
      'item_location':
          GeoPoint(_locationData.latitude, _locationData.longitude),
      'item_date': DateTime.now(),
      'item_images': imageMap,
    });
 

Затем вы можете просмотреть документ, который вы добавили в свою коллекцию, и таким образом получить его идентификатор.

Комментарии:

1. как мне увидеть документ, который я добавил? Допустим, у меня есть 30 документов. Я добавляю еще один, как мне сказать моей программе, чтобы она извлекла этот конкретный недавно созданный документ?