Удалить элемент из массива вложенных коллекций в Firestore Firebase - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь удалить элемент из массива в коллекции профилей с именем items subcollection. Функция должна запускаться всякий раз, когда элемент удаляется из основной коллекции элементов. Проблема с приведенной ниже функцией заключается в том, что при срабатывании она удаляет все элементы из профиля, а не только один. Как я мог перебирать массив элементов и выполнять проверку идентификатора удаленного элемента.

exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onDelete((snap, context) => {
    const { itemId } = context.params
    const deletedItem = snap.data()

      
    if(deletedItem){
      db.collection('profiles')
        .doc(deletedItem.user.id)
        .update({
          items: admin.firestore.FieldValue.delete({
              id: itemId,
              title: deletedItem.title,
              price: deletedItem.price,
              image: deletedItem.image
          })
        })
      }
    return true
})

Ответы [ 2 ]

1 голос
/ 29 мая 2020

onDelete триггеры срабатывают только при удалении всего документа. К этому времени уже поздно - документа просто нет. Что-то решило удалить его, и вы не сможете сказать, что это было сделано.

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

0 голосов
/ 29 мая 2020

Я также пробовал триггер onUpdate для удаления данных вместе с триггером onWrite для прослушивания любых изменений при изменении данных, однако в обоих случаях он не дал мне никакого результата для части, относящейся к удалению данных. Подколлекция элементов в коллекции профилей остается неизменной. Я не уверен, в чем ошибка функции, выполнение функции не показывает ошибок, завершается статусом Ok ....

exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onUpdate((change, context) => {
  const { itemId } = context.params
  const beforeItem = change.before.data()
  const updatedItem = change.after.data()

    if (updatedItem === null) {
    

    return db.collection('profiles')
      .doc(beforeItem.user.id)
      .delete({
        items: admin.firestore.FieldValue.arrayRemove({
          id: itemId,
          title: beforeItem.title,
          price: beforeItem.price, 
          image: beforeItem.image,
          status: beforeItem.status,
        })
      })
    }  
    return true

})

exports.updateDeletedItemOnProfile = functions.firestore
.document('items/{itemId}')
.onUpdate((change, context) => {
  const { itemId } = context.params
  const beforeItem = change.before.data()
  const updatedItem = change.after.data()

    if (updatedItem === null) {
    

    return db.collection('profiles')
      .doc(beforeItem.user.id)
      .update({
        items: admin.firestore.FieldValue.delete({
          id: itemId,
          title: beforeItem.title,
          price: beforeItem.price, 
          image: beforeItem.image,
          status: beforeItem.status,
        })
      })
    }  
    return true

})
...