Firestore, как получить последний документ коллекции и добавить новый с увеличенным идентификатором? - PullRequest
0 голосов
/ 22 мая 2019

Я, вероятно, допустил ошибку с автоматически сгенерированными идентификаторами для документов внутри моей коллекции событий.Я добавил eventId для сгенерированных событий и назначил eventId вручную каждому событию.

Могу ли я как-то получить последний документ с его eventId и добавить новый документ с eventId последнего документа, увеличенным на единицу.

Илия должен удалить автоматически сгенерированные Id-события и создать новые с неавтоматизированными ID?

GitHub: https://github.com/Verthon/event-app

Я разместил рабочее приложение React.js на netlify: https://eventooo.netlify.com/

Как это работает:

  • Я добавил уникальный eventId к каждому фиктивному событию внутри коллекции событий,
  • На основании этого уникального eventId я создаю ссылку на конкретное отдельное событие.js,
  • Пользователь может создать событие, предоставляющее информацию в / create-event,
  • Когда кто-то создает событие, я хотел бы добавить событие в коллекцию событий с идентификатором приращения, я добавил 7 событийсоздан внутри консоли, поэтому следующий должен иметь id = 7, что-то вроде event1, event2 ... с автоинкрементом
  • Внутри коллекции пользователей я храню currentUser.uid от имени пользователя и имени хоста, предоставленных пользователем
Event Creator

submitEvent = (e) => {
    e.preventDefault();
    const eventRef = this.props.firebase.db.collection("events").doc();
    eventRef.set({
      title: this.state.title,
      host: this.state.host,
      localization: this.state.localization,
      description: this.state.description,
      category: this.state.category,
      day: this.state.day,
      hour: this.state.hour,
      featuredImage: this.state.imageUrl,
      uid: this.props.firebase.auth.currentUser.uid
    });


    const citiesRef = this.props.firebase.db.collection("cities").where("city", "==", this.state.localization);
    const cityRef = this.props.firebase.db.collection("cities").doc();
    citiesRef.get()
      .then(querySnapshot => {
        if(querySnapshot.exists){
          console.log("exist");
          return
        }else{
          cityRef.set({
            city: this.state.localization,
          })
        }
      });
    const userRef = this.props.firebase.db.collection("users").doc();
    userRef.set({
      user: this.state.host,
      uid: this.props.firebase.auth.currentUser.uid
    });


Firestore Settings

Спасибо

1 Ответ

1 голос
/ 22 мая 2019

Я понимаю, что вы хотите, чтобы ваше значение eventId происходило из последовательности чисел. Наилучшим подходом для такой необходимости является использование распределенного счетчика, как описано в документе: https://firebase.google.com/docs/firestore/solutions/counters

Я не знаю, какой язык вы используете, но я вставляю код JavaScript трех функций из этой документации и пишу код, который сгенерирует порядковый номер, который вы можете использовать для создания документов.

  var db = firebase.firestore();

  //From the Firebase documentation

  function createCounter(ref, num_shards) {
    var batch = db.batch();

    // Initialize the counter document
    batch.set(ref, { num_shards: num_shards });

    // Initialize each shard with count=0
    for (let i = 0; i < num_shards; i++) {
      let shardRef = ref.collection('shards').doc(i.toString());
      batch.set(shardRef, { count: 0 });
    }

    // Commit the write batch
    return batch.commit();
  }

  function incrementCounter(db, ref, num_shards) {
    // Select a shard of the counter at random
    const shard_id = Math.floor(Math.random() * num_shards).toString();
    const shard_ref = ref.collection('shards').doc(shard_id);

    // Update count
    return shard_ref.update(
      'count',
      firebase.firestore.FieldValue.increment(1)
    );
  }

  function getCount(ref) {
    // Sum the count of each shard in the subcollection
    return ref
      .collection('shards')
      .get()
      .then(snapshot => {
        let total_count = 0;
        snapshot.forEach(doc => {
          total_count += doc.data().count;
        });

        return total_count;
      });
  }

  //Your code

  var ref = firebase
    .firestore()
    .collection('counters')
    .doc('1');

  var num_shards = 2  //Adapt as required, read the doc

  //Initialize the counter bay calling ONCE the createCounter() method

  createCounter(ref, num_shards);

  //Then, when you want to create a new number and a new doc you do

  incrementCounter(db, ref, num_shards)
    .then(() => {
      return getCount(ref);
    })
    .then(count => {
      console.log(count);
      //Here you get the new number form the sequence
      //And you use it to create a doc
      db.collection("events").doc(count.toString()).set({
         category: "education",
         //.... 
      })
    });

Без особых подробностей о функциональных требованиях трудно сказать, есть ли разница между использованием числа из последовательности в качестве uid документа или в качестве значения поля в документе. Это зависит от запросов, которые вы можете сделать для этой коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...