Как получить данные из cloud firestore, затем отфильтровать их, сопоставить, а затем вернуть?

#javascript #reactjs #google-cloud-firestore #return #es6-promise

#javascript #reactjs #google-cloud-firestore #Возврат #es6-обещание

Вопрос:

Я пытаюсь получить данные из firestore, а затем отфильтровать их, а затем сопоставить их следующим образом:

 return Inventory
.filter(x =>x["sub_category"] === item amp;amp; x["category"] === category)
.map(({id, item, price, quantity, image})=>{

//sets the default value for the item with that specific id
const defVal = parseInt((selectedQty.id === id)?selectedQty.qty:0)

return (
    <React.Fragment key={uuid()}>
        <div className="card">
            <img src={image()} alt={item} />
            <p>{item}</p>
            
            <div className="innerBox">
                <div className="dropdown">
                    <label htmlFor="quantity">Qty:</label>
                    <select id="quantity" defaultValue={defVal===0?1:defVal} onChange={e => {
                        e.preventDefault()
                        setSelectedQty({id, qty: parseInt(e.target.value)})
                    }}>
                    {
                        Array(quantity).fill().map((_, i)=> {
                            if(i===0){
                                return <option key={uuid()} value={0}>-</option>
                            }else{
                                return <option key={uuid()} value={i} >{i}</option>
                            }
                        })
                    }
                    </select>
                </div>
                <b>$ {price}</b>
            </div>
            <button type="submit" onClick={()=> {
                addToCart(id, item, parseInt(finalQty), price, image(), parseInt(finalQty)*parseFloat(price))
                setSelectedQty({id:null, qty: 0})
            }}>Add to Cart</button>
        </div>
    </React.Fragment>
)})
  

В настоящее время я использую Inventory Array, но хочу переключиться на firestore, но понятия не имею, как это сделать. Я знаю о шаге db.collection().get().then(и т. Д. …), Но я не знаю, как сопоставить его, чтобы вернуть его внутри Then

Ответ №1:

Когда вы извлекаете данные из cloud firestore, он возвращает снимок документа / коллекции.

Документ:

 db.collection("colName").doc("docID").get().then(docSnapShot=>{
    const docID = docSnapShot.id;
    const docData = docSnapShot.data();
})
  

Коллекция:

 db.collection("colName").get().then(colSnapShot=>{
    const isEmpty = colSnapShot.empty;
    const docsData = colSnapShot.docs.forEach(docSnapShot=>{
        return docSnapShot.data();
    })
})
  

Я полагаю, что ваше решение будет выглядеть примерно так:

 let arrOfDocs = await db.collection("colName").get().then(colSnapShot=>{
    return colSnapShot.docs.map(docSnapShot=>{
        return docSnapShot.data();
    })
})
  

Обратите внимание, что для прослушивания текущих обновлений замените get().then(snapshot=>{}) на onSnapshot(snapshot=>{})