Firestore / Javascript: Как получить документ с именем даты? - PullRequest
0 голосов
/ 02 февраля 2020

Как мне .()get a document в пожарном депо, которое названо как дата? В частности, как мне получить последнюю дату с именем document, включая fields, хранящуюся в ней, в firestore с использованием javascript?

Изображение для поддержки моего вопроса: This is the .get() query I am aiming to accomplish

Вот текущий код, который я использую:

                            firebase.auth().onAuthStateChanged(user => {
                                if(user){
                                    this.userId = user.uid;
                                }
                            let userRef1 = firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep");
                            return userRef1.get()
                            .then(function(querySnapshot) {
                                querySnapshot.forEach(function(doc) {
                                    console.log(doc.id, " => ", doc.data());
                                    });
                                });

РЕДАКТИРОВАТЬ

Хотя мое изображение предназначено только для определенного c пользователя. То, что я пытаюсь выполнить sh, - это получить запрос "dynamici c", означающий запрос, доступный для любого пользователя, который входит в мою систему.

Например: если пользователь A имеет последнюю версию Документ FitBit с именем De c 9, 2019 и пользователь B имеет самый последний документ FitBit с именем De c 11, 2019.

Один запрос должен иметь возможность определить и получить самую последнюю дату, когда текущий журнал записал у пользователя есть.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2020

Идентификаторы ваших документов в коллекции fitbit_sleep - это строки даты (т. Е. Dec 9, 2019). Таким образом, вам просто нужно передать эту строку в метод doc() следующим образом:

let userRef1 = firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep");

userRef1
  .doc("Dec 9, 2019")
  .get()
  .then(snap => {
      console.log(snap.data());
  }); 

Обратите внимание, что пока ваши идентификаторы документов технически действительны (см. https://firebase.google.com/docs/firestore/quotas#collections_documents_and_fields) довольно классно использовать другой формат, если вы хотите использовать дату в качестве уникального идентификатора, как, например, следующий формат YYYYMMDD. Таким образом, вы могли бы использовать 20191209 вместо Dec 9, 2019.


Однако, сказав это, также стоит отметить, что не рекомендуется использовать монотонно увеличивающиеся идентификаторы документов такие как: 20191209, 20191210, 20191211, потому что, как объясняется в do c ", такие последовательные идентификаторы могут привести к горячим точкам , которые влияют на задержку."

Итак, если вы планируете создавать эти fitbit_sleep документы " с очень высокой скоростью " и назначать им монотонно увеличивающиеся идентификаторы, такие как 20191209, 20191210, 20191211, это будет лучше принять другую стратегию.

Вы можете использовать идентификаторы документов, автоматически назначаемые Firestore, с помощью метода add() и добавлять в сам новый документ поле со значением даты в формате YYYYMMDD , Затем вы можете использовать запрос, чтобы найти данный документ, как показано ниже:

let userRef1 = firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep");

userRef1
  .where('date', '==', '20191209');
  .get()
  .then(querySnapshot => {  // Note: this a QuerySnapshot not a DocumentSnapshot
     console.log(querySnapshot.docs[0].data());
  })

РЕДАКТИРОВАТЬ В СООТВЕТСТВИИ С РЕДАКТИРОВКОЙ ВАШЕГО ВОПРОСА

После редактирования Похоже, что вы хотите запросить самый последний документ в коллекции users/userId/fitbit_sleep. Для этого вам необходимо заказать и ограничить документами, возвращенными по вашему запросу, как описано в do c.

Там это два случая:

Случай 1: Одно из полей меток времени в ваших документах (т. е. dateAdded или endTime) соответствует значению, которое вы хотите отсортировать (т. е. они соответствуют на дату, представленную идентификатором документа).

Затем можно заказать запрос на основе одного из этих полей и ограничить его последним документом следующим образом:

let userRef1 = firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep");

userRef1
  .orderBy('endTime', 'desc')
  .limit(1)
  .get()
  .then(querySnapshot => {  // Note: this a QuerySnapshot not a DocumentSnapshot
     console.log(querySnapshot.docs[0].data());
  })

Случай 2 Нельзя использовать одно из этих полей меток времени, поскольку они не соответствуют дате, представленной идентификатором документа. Затем вам нужно будет добавить дополнительное поле в ваш документ, например, со значением даты в формате ГГГГММДД (если есть только один документ в день), и отсортировать по этому полю. Поэтому, если вы вызовете это поле orderingDate, вы бы изменили приведенный выше запрос следующим образом:

userRef1
  .orderBy('orderingDate', 'desc')
  .limit(1)
  .get()
  .then(querySnapshot => {  // Note: this a QuerySnapshot not a DocumentSnapshot
     console.log(querySnapshot.docs[0].data());
  })
0 голосов
/ 02 февраля 2020

Я уже нашел решение своей проблемы. Я думаю, что невозможно получить документ по запросу для каждого уникального пользователя? Поэтому я использовал поле dataAdded вложенного документа fitbit_sleep вошедшего в систему пользователя, чтобы получить () последнюю дату с именем document и все необходимые мне поля. Я адаптировал его из Ответа 2 случая Рено

firebase.auth().onAuthStateChanged(user => {
 if(user){
  this.userId = user.uid;
 }
 let userRef1 = 
 firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep");
 return userRef1.get()
 .then(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
   console.log(doc.id, " => ", doc.data());
   });
});

Я изменил его на следующее:

firebase.auth().onAuthStateChanged(user => {
 if(user){
  this.userId = user.uid;
 }
 let userRef1 = 
 firebase.firestore().collection("users").doc(userId).collection("fitbit_sleep").orderBy("dateAdded", "desc").limit(1);
 return userRef1.get()
 .then(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
   console.log(doc.id, " => ", doc.data());
   });
});

И из измененного кода, если это относится к ваши проекты, вы должны ожидать этого в результате запроса:

enter image description here

Хотя я понимаю, что есть некоторые опасения по поводу соглашений об именах мои документы. Я полностью согласен с Рено и Дугом, по крайней мере, заменить вместо присвоения имени уникальный идентификатор или uid. Но большая часть функциональности, особенно при работе с базами данных, исходит от мобильного приложения нашего дипломного проекта. Я ценю отзывы и постараюсь убедить разработчика мобильных приложений следовать соглашениям!

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