Удалить элемент по ключу / значению из массива Firestore - PullRequest
2 голосов
/ 16 мая 2019

У меня есть массив в Firestore, который структурирован так:

palettes
    0: {date: 2019-05-01, name: "First Palette", palette: [array]}
    1: {date: 2019-05-02, name: "Palette 2", palette: [array]

Каждый элемент в массиве palettes является элементом палитры с датой, именем и данными палитры в массиве.

В моем приложении React я пытаюсь удалить конкретную палитру в базе данных Firestore, ссылаясь на ее значение name и не имея никакой удачи.

Например, если у меня есть paletteName «Палитра 2», переданная из события щелчка, как я могу удалить палитру с этой строкой в ​​качестве значения имени?

Вот что я пробовал:

1

const deletePalette = paletteName => {
    db.collection('users').doc(user.uid)
    .update({
         palettes: firebase.firestore.FieldValue.arrayRemove({
             name: paletteName
         })
    })
    // ...
}

2

const deletePalette = paletteName => {
    db.collection('users').doc(user.uid)
        .update({
            palettes: firebase.firestore.FieldValue.arrayRemove(paletteName)
        })
    // ...
}

3.

const deletePalette = paletteName => {
    const ref = db.collection('users').doc(`${user.uid}/palettes/`)

    ref.update({
        [paletteName]: firebase.firestore.FieldValue.delete()
    })
    // ...
}

4

const deletePalette = paletteName => {
    db.collection('users').doc(user.uid)
    .update({
        palettes: palettes.filter(
            palette => palette.name !== paletteName
        )
    })
    // ...
}

Никто из них этого не делает. Что мне здесь не хватает?

Ответы [ 2 ]

2 голосов
/ 16 мая 2019

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

Вам придется

1) прочитать весь документ в память,
2) изменить массив в памяти так, как вы хотите,
3) затем обновите поле до документа.

0 голосов
/ 16 мая 2019

Спасибо @Doug, который помог.

В конце концов это было довольно легко.У меня уже была ссылка на документ в состоянии моего приложения, поэтому оттуда все, что мне было нужно, это:

const deletePalette = paletteName => {
    // currentUser was in my app state and contains the user `doc` data
    // so just grab the palettes
    const userPalettes = currentUser.palettes

    // filter the palettes array
    const newPalettes = userPalettes.filter(
        palette => palette.name !== paletteName
    )

    // update the doc with the filtered palettes
    var userRef = db.collection('users').doc(user.uid)
    userRef.update({
        palettes: newPalettes
    })

    // update my state to reload user data
    setPaletteRemoved(true)

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