Angular, Angularfire2, Получение среднего числа в базе данных - PullRequest
0 голосов
/ 06 мая 2018

Я пытался выяснить это в течение нескольких дней. Я чувствую, что это намного проще, чем я думаю. Я использую angular и angularfire2. У меня настроена рейтинговая система, и, по сути, я пытаюсь сделать запрос к коллекции и получить числовое поле в каждом документе, сложить их и получить среднее значение. Однако все, что я знаю, как это сделать, это запросить базу данных и отобразить весь мой отзыв в шаблоне и узнать, как получить общее количество документов в собрании, чтобы у меня было число, на которое можно разделить. Я не могу понять в своем файле Typscript, как получить все эти значения и сложить их вместе, чтобы затем получить и усреднить.

this.reviews = db.collection('dispensaries').doc(this.id).collection('reviews').snapshotChanges().map(actions => {
  return actions.map(a => {
    const data = a.payload.doc.data();
    data.id = a.payload.doc.id;
    console.log(data.stars);
    return data;
  });
});


db.collection('dispensaries').doc(this.id).collection('reviews')
  .ref
  .get().then(function(querySnapshot) {
    console.log(querySnapshot.size);
  });

1 Ответ

0 голосов
/ 09 июля 2018

У меня похожая проблема, но я смог получить данные и поместить число в переменную, проблема в том, что я не могу выполнить обновление внутри firestore, но прилагаю код, который может работать для вас, этот метод принимает 2 параметра: идентификатор и число (количество), которое необходимо добавить к существующему, существующее, которое я получаю с помощью метода get.

Код:

this.afs.doc(`productos/${id}`).ref.get().then(function(doc) {
  if (doc.exists) {
    const reemplazarCantidad = doc.get('cantidadActual') + cant;
    console.log('Datos:', doc.data());
    console.log('Hay:', doc.get('cantidadActual'));
    console.log('Se debe sumar: ', cant);
    console.log('total: ', reemplazarCantidad);
  } else {
      console.log('No hay datos');
  }
}).catch(function(error) {
    console.log('Error:', error);
});

} и, как логично в конструкторе, я объявляю afs как angularfirestore

constructor(public afs: AngularFirestore) { 

Ну, решение, которое я нашел сейчас:

в службе.

 agregaCantidad(id, cant){
this.afs.doc(`productos/${id}`).ref.get().then(function(doc) {
  if (doc.exists) {
    const reemplazarCantidad = doc.get('cantidadActual') + cant;
    doc.ref.update({cantidadActual: reemplazarCantidad});
  } else {
      console.log('No hay datos');
  }
}).catch(function(error) {
    console.log('Error:', error);
});

}

и вызов метода:

this.xxservicexx.agregaCantidad (idProducto, cantidad)

примечание: часть этого решения включает запись в качестве идентификатора продукта названия самого продукта. Это показалось мне наиболее практичным.

но я не уверен, правильный ли он или лучший

Спасибо и всего наилучшего. ML

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