Google Firestore - วิธีรับเอกสารหลายรหัสในการเดินทางไปกลับครั้งเดียว

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะรับเอกสารหลายรายการตามรายการรหัสในการเดินทางไปกลับครั้งเดียว (การโทรผ่านเครือข่าย) ไปยัง Firestore


person Joon    schedule 13.10.2017    source แหล่งที่มา
comment
ดูเหมือนคุณจะคิดว่าการไปกลับทำให้เกิดปัญหาด้านประสิทธิภาพในแอปของคุณ ฉันจะไม่ถือว่า Firebase มีประวัติว่าทำงานได้ดีในกรณีเช่นนี้ เนื่องจาก ไปป์ไลน์คำขอ แม้ว่าฉันจะไม่ได้ตรวจสอบว่า Firestore ทำงานอย่างไรในสถานการณ์นี้ แต่ฉันอยากเห็นข้อพิสูจน์ถึงปัญหาด้านประสิทธิภาพก่อนที่จะสันนิษฐานว่ามันมีอยู่จริง   -  person Frank van Puffelen    schedule 13.10.2017
comment
สมมติว่าฉันต้องการเอกสาร a, b, c เพื่อทำบางสิ่งบางอย่าง ฉันขอทั้งสามคำขอพร้อมกันโดยแยกกัน a ใช้เวลา 100 มิลลิวินาที, b ใช้เวลา 150 มิลลิวินาที และ c ใช้เวลา 3,000 มิลลิวินาที ด้วยเหตุนี้ ฉันต้องรอถึง 3,000 มิลลิวินาทีจึงจะทำงานได้ มันจะเป็น max ในนั้น จะมีความเสี่ยงมากขึ้นเมื่อเอกสารที่จะดึงข้อมูลมีจำนวนมาก ขึ้นอยู่กับสถานะเครือข่าย ฉันคิดว่านี่อาจเป็นปัญหาได้   -  person Joon    schedule 13.10.2017
comment
จะไม่ส่งทั้งหมดเป็น SELECT * FROM docs WHERE id IN (a,b,c) เดียวใช้เวลานานเท่ากันใช่ไหม ฉันไม่เห็นความแตกต่าง เนื่องจากการเชื่อมต่อเกิดขึ้นเพียงครั้งเดียวและส่วนที่เหลือจะถูกส่งต่อไปยังจุดนั้น เวลา (หลังจากสร้างการเชื่อมต่อครั้งแรก) คือเวลาโหลดเอกสารทั้งหมด + เดินทางไปกลับ 1 ครั้ง ซึ่งเท่ากันสำหรับทั้งสองวิธี ถ้ามันทำงานแตกต่างออกไปสำหรับคุณ คุณช่วยแบ่งปันตัวอย่าง (ตามคำถามที่เชื่อมโยงของฉัน) ได้ไหม   -  person Frank van Puffelen    schedule 13.10.2017
comment
ฉันคิดว่าฉันเสียคุณไปแล้ว เมื่อคุณบอกว่าเป็นไปป์ไลน์ คุณหมายถึงว่า Firestore จัดกลุ่มและส่งคำค้นหาไปยังเซิร์ฟเวอร์โดยอัตโนมัติในการเดินทางไปกลับฐานข้อมูลครั้งเดียวหรือไม่   -  person Joon    schedule 14.10.2017
comment
FYI สิ่งที่ฉันหมายถึงโดยการเดินทางแบบไปกลับคือการเรียกเครือข่ายหนึ่งครั้งไปยังฐานข้อมูลจากไคลเอนต์ ฉันกำลังถามว่าข้อความค้นหาหลายรายการถูกจัดกลุ่มโดยอัตโนมัติเป็นการไปกลับครั้งเดียวโดย Firestore หรือการสืบค้นหลายรายการดำเนินการเป็นการไปกลับหลายครั้งพร้อมกันหรือไม่   -  person Joon    schedule 14.10.2017
comment
คุณอ่านคำตอบของฉันที่ฉันเชื่อมโยงในความคิดเห็นแรกของฉันหรือไม่? มันอธิบายแนวคิดของการวางท่อได้ดีกว่าที่ฉันสามารถทำได้ในความคิดเห็นเหล่านี้   -  person Frank van Puffelen    schedule 14.10.2017
comment
ใช่ ฉันได้อ่านคำตอบของคุณแล้ว แต่ก็ยังไม่ชัดเจนว่าจะมีการโทรหลายเครือข่ายหรือเพียงสายเดียว ดูเหมือนว่าจะมีการเรียกเครือข่าย n รายการพร้อมกันสำหรับ n รายการ แทนที่จะเรียกผ่านเครือข่ายเพียงครั้งเดียวที่ทำการสืบค้น n รายการพร้อมกัน   -  person Joon    schedule 14.10.2017
comment
ไม่ได้ขนานกัน แต่เป็นไปในทิศทางเดียวกัน แต่ผลลัพธ์ก็แทบจะเหมือนกัน อีกครั้ง: ฉันยังไม่ได้ตรวจสอบว่านั่นคือสิ่งที่ Firestore ทำ แต่ฉันจะทำการวัดบางอย่างก่อนที่จะถือว่าต้องใช้เวลา N*(read_time+transfer_time+latency) หากพวกมันถูกไปป์ไลน์ มันจะใกล้กับ N*(transfer_time)+read_time+latency มากขึ้น   -  person Frank van Puffelen    schedule 14.10.2017
comment
ฉันเชื่อว่า @FrankvanPuffelen ตอบสิ่งนี้ (ทำงานที่ Firebase) ในคำถามอื่น: stackoverflow.com/questions/35931526/   -  person Nick Franceschina    schedule 30.01.2018
comment
สำหรับทุกคนที่พยายามหาวิธีเรียกใช้คำขอหลายรายการในลูปเนื่องจาก SDK มือถือ (Flutter สำหรับ iOS/Android) ไม่มีฟังก์ชัน getAll() ลองดูโพสต์นี้: stackoverflow.com/a/42176121/9248277 (อธิบายวิธีจัดการรายการ Futures แบบขนาน)   -  person Lucas Aschenbach    schedule 21.04.2020


คำตอบ (13)


หากคุณอยู่ในโหนด:

https://github.com/googleapis/nodejs-firestore/blob/master/dev/src/index.ts#L978

/**
* Retrieves multiple documents from Firestore.
*
* @param {...DocumentReference} documents - The document references
* to receive.
* @returns {Promise<Array.<DocumentSnapshot>>} A Promise that
* contains an array with the resulting document snapshots.
*
* @example
* let documentRef1 = firestore.doc('col/doc1');
* let documentRef2 = firestore.doc('col/doc2');
*
* firestore.getAll(documentRef1, documentRef2).then(docs => {
*   console.log(`First document: ${JSON.stringify(docs[0])}`);
*   console.log(`Second document: ${JSON.stringify(docs[1])}`);
* });
*/

นี่มีไว้สำหรับ SDK เซิร์ฟเวอร์โดยเฉพาะ

อัปเดต: Cloud Firestore [sdk ฝั่งไคลเอ็นต์] รองรับ IN Queries แล้ว!

https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html

myCollection.where(firestore.FieldPath.documentId(), 'in', ["123","456","789"])

person Nick Franceschina    schedule 24.01.2018
comment
สำหรับใครก็ตามที่ต้องการเรียกใช้เมธอดนี้ด้วยอาร์เรย์การอ้างอิงเอกสารที่สร้างขึ้นแบบไดนามิก คุณสามารถทำได้ดังนี้: firestore.getAll(...arrayOfReferences).then() - person Horea; 06.03.2018
comment
@NickFranceschina คุณรู้วิธีใช้กับ Angularfire หรือ firebase vanilla libs ได้อย่างไร? - person Kisinga; 23.01.2019
comment
ฉันขอโทษ @KamanaKisinga ... ฉันไม่ได้ทำเรื่อง firebase มาเกือบปีแล้วและช่วยไม่ได้จริงๆ ในเวลานี้ (เฮ้ ดูสิ วันนี้ฉันโพสต์คำตอบนี้เมื่อหนึ่งปีที่แล้วจริงๆ แล้ว!) - person Nick Franceschina; 24.01.2019
comment
@NickFranceschina ???????? ยุติธรรมพอแล้ว ขอบคุณ - person Kisinga; 24.01.2019
comment
แล้ว firestore.getAll.call(null, arrayOfReferences) ล่ะถ้าตัวดำเนินการสเปรดยังไม่รองรับ? - person Julian Paolo Dayag; 12.02.2019
comment
SDK ฝั่งไคลเอ็นต์ยังมีฟังก์ชันการทำงานนี้ด้วย ดูคำตอบของ jeodonara สำหรับตัวอย่าง: stackoverflow.com/a/58780369 - person Frank van Puffelen; 02.12.2019
comment
คำเตือน: ขณะนี้ตัวกรองในจำกัดอยู่ที่ 10 รายการ ดังนั้นคุณอาจจะพบว่ามันไม่มีประโยชน์เมื่อคุณกำลังจะเข้าสู่การผลิต - person Martin Cremer; 12.01.2020
comment
จริงๆ แล้วคุณต้องใช้ firebase.firestore.FieldPath.documentId() ไม่ใช่ 'id' - person Maddocks; 26.01.2020
comment
ได้รับข้อผิดพลาดแปลก ๆ นี้ ค่าที่สอดคล้องกันสำหรับ FieldPath.documentId() ต้องเป็นสตริงหรือ DocumentReference - person funct7; 24.03.2020
comment
ขอบคุณ สิ่งนี้ช่วยชีวิตฉันได้ - person Swetabja Hazra; 16.06.2020
comment
แอนดรอยด์: List<String> lst;, FirebaseFirestore.getInstance().collection("collection_name").whereIn(FieldPath.documentId(), lst).get().addOnCompleteListener(...); - person Alaa M.; 04.07.2020
comment
ฉันไม่เคยคิดที่จะส่ง firestore.FieldPath.documentId() ไปที่ไหน นี่เป็นการใช้ In Query ได้อย่างยอดเยี่ยม! - person Ayyappa; 09.10.2020

พวกเขาเพิ่งประกาศฟังก์ชันการทำงานนี้ https://firebase.googleblog.com/2019/11/cloud-firestore-now-supports-in-queries.html

ตอนนี้คุณสามารถใช้ข้อความค้นหาได้ แต่โปรดทราบว่าขนาดอินพุตต้องไม่เกิน 10

userCollection.where('uid', 'in', ["1231","222","2131"])

person jeadonara    schedule 09.11.2019
comment
มี WhereIn แบบสอบถามมากกว่าที่ และฉันไม่ทราบวิธีออกแบบแบบสอบถามสำหรับเอกสารหลายฉบับจากรายการรหัสเอกสารที่เป็นของคอลเลกชันเฉพาะ กรุณาช่วย. - person Compile error end; 17.11.2019
comment
@Compileerrorend คุณลองสิ่งนี้ได้ไหม db.collection('users').where(firebase.firestore.FieldPath.documentId(), 'in',["123","345","111"]).get() - person jeadonara; 03.12.2019
comment
ขอบคุณ โดยเฉพาะอย่างยิ่งสำหรับ firebase.firestore.FieldPath.documentId() - person Ivan Chernykh; 22.12.2019
comment
@jeadonara ในกรณีที่อาร์เรย์อินพุตมากกว่า 10 ฉันควรใช้อะไร - person Ramesh Vishnoi; 24.11.2020
comment
@RameshVishnoi คุณสามารถใช้ Promise.all() ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/) - person jeadonara; 29.11.2020

ในทางปฏิบัติ คุณจะใช้ firestore.getAll เช่นนี้

async getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    const users = await this.firestore.getAll(...refs)
    console.log(users.map(doc => doc.data()))
}

หรือมีไวยากรณ์สัญญา

getUsers({userIds}) {
    const refs = userIds.map(id => this.firestore.doc(`users/${id}`))
    this.firestore.getAll(...refs).then(users => console.log(users.map(doc => doc.data())))
}
person Sebastian    schedule 27.11.2018
comment
นี่ควรเป็นคำตอบที่เลือกจริงๆ เพราะช่วยให้คุณใช้มากกว่า 10 รหัสได้ - person sshah98; 22.04.2020
comment
มันได้ผล! ขอบคุณ. เอกสารเกี่ยวกับเรื่องนี้อยู่ที่ไหน? ฉันค้นหา getAll และไม่พบที่ไหนเลย - person TravRob; 07.12.2020
comment
@TravRob สิ่งนี้อาจมีให้บริการใน Firebase บางรสชาติ เช่น Node แต่ไม่ได้อยู่ใน JavaScript API แน่นอน - person zxbEPREF; 21.02.2021

คุณสามารถใช้ฟังก์ชันเช่นนี้:

function getById (path, ids) {
  return firestore.getAll(
    [].concat(ids).map(id => firestore.doc(`${path}/${id}`))
  )
}

สามารถเรียกได้ด้วย ID เดียว:

getById('collection', 'some_id')

หรืออาร์เรย์ของ ID:

getById('collection', ['some_id', 'some_other_id'])
person JP de la Torre    schedule 17.05.2018

ไม่ ขณะนี้ยังไม่มีวิธีแบทช์คำขออ่านหลายรายการโดยใช้ Cloud Firestore SDK ดังนั้นจึงไม่มีวิธีรับประกันว่าคุณจะสามารถอ่านข้อมูลทั้งหมดได้ในคราวเดียว

อย่างไรก็ตาม ตามที่ Frank van Puffelen ได้กล่าวไว้ในความคิดเห็นข้างต้น ไม่ได้หมายความว่าการดึงเอกสาร 3 รายการจะช้ากว่าการดึงเอกสารฉบับเดียวถึง 3 เท่า วิธีที่ดีที่สุดคือทำการวัดผลของคุณเองก่อนที่จะได้ข้อสรุปที่นี่

person Sam Stern    schedule 16.10.2017
comment
ประเด็นก็คือ ฉันต้องการทราบขีดจำกัดทางทฤษฎีต่อประสิทธิภาพของ Firestore ก่อนที่จะย้ายไปยัง Firestore ฉันไม่ต้องการย้ายข้อมูลแล้วพบว่ามันไม่ดีพอสำหรับกรณีการใช้งานของฉัน - person Joon; 17.10.2017
comment
สำหรับฉัน การไม่มีการสนับสนุนแบบแบตช์นั้นไม่ดี เนื่องจากการเรียกฐานข้อมูลของแอปส่วนใหญ่กำลังรับเอกสารหลายชุด (มักเป็นร้อย) พร้อมรหัสหลายรหัส เพื่อให้มีประสิทธิภาพ การโทรเหล่านั้นต้องรวมเข้าด้วยกันให้ฉัน - person Joon; 17.10.2017
comment
@Joon ดูเหมือนว่าคุณจะต้องประเมินโครงสร้างข้อมูลของคุณอีกครั้งเพื่อให้มีประสิทธิภาพมากขึ้นในฐานข้อมูล NoSQL เช่น Cloud Firestore คำแนะนำที่ดีที่สุดที่ฉันสามารถให้ได้คือการคิดย้อนกลับจากคำถาม นึกถึงข้อความค้นหาที่คุณต้องการดำเนินการ และจัดโครงสร้างข้อมูลของคุณเพื่อให้คุณแสดงข้อมูลได้อย่างง่ายดาย การค้นหาทั้งหมดใน Cloud Firestore รวดเร็ว - person Sam Stern; 17.10.2017
comment
สวัสดี มีการพิจารณา cose ที่นี่ด้วย สมมติว่าฉันได้จัดเก็บรายชื่อ ID ของเพื่อนทั้งหมดไว้และหมายเลขคือ 500 ฉันสามารถรับรายชื่อได้ในค่าใช้จ่ายในการอ่าน 1 ครั้ง แต่เพื่อแสดงชื่อและ photoURL ของพวกเขา จะต้องเสียค่าใช้จ่ายในการอ่าน 500 ครั้ง - person Tapas Mukherjee; 26.10.2017
comment
หากคุณกำลังพยายามอ่านเอกสาร 500 รายการ จะต้องอ่าน 500 ครั้ง หากคุณรวมข้อมูลที่คุณต้องการจากเอกสารทั้งหมด 500 ฉบับเป็นเอกสารพิเศษเพียงฉบับเดียว ระบบจะใช้เวลาอ่านเพียงครั้งเดียวเท่านั้น เรียกว่าการทำสำเนาข้อมูลค่อนข้างเป็นเรื่องปกติในฐานข้อมูล NoSQL ส่วนใหญ่ รวมถึง Cloud Firestore - person Frank van Puffelen; 27.10.2017
comment
@FrankvanPuffelen ไม่มีวิธีอื่นใดนอกจากสิ่งที่คุณอธิบายว่าเป็นเอกสารทั้งหมด 500 ฉบับในเอกสารพิเศษฉบับเดียว ฉันประสบปัญหาในการยอมรับข้อจำกัดนี้ในฐานข้อมูล NoSQL คุณช่วยให้ความกระจ่างเกี่ยวกับโพสต์หรือการอภิปรายที่เกี่ยวข้องเกี่ยวกับหลักปฏิบัติทั่วไปในกรณีนี้ได้ไหม ขอบคุณมาก - person Sitian Liu; 28.10.2017
comment
@FrankvanPuffelen ตัวอย่างเช่นใน mongoDb คุณสามารถใช้ ObjectId เช่นนี้ stackoverflow.com/a/32264630/648851 - person Sitian Liu; 28.10.2017
comment
ข้อควรพิจารณาอื่นๆ ในที่นี้ ฉันคิดว่า (ทีมงาน Firestore จะต้องยืนยัน) คือ หากคุณมีข้อมูลที่ตรงกับการค้นหาของคุณที่แคชไว้ในเครื่อง ซึ่งดำเนินการโดยอัตโนมัติด้วย Firestore จะไม่เสียค่าใช้จ่ายในการอ่าน 500 ครั้ง คุณจะถูกเรียกเก็บเงินสำหรับการอ่านที่ต้องรับเอกสาร/อัปเดตจากเซิร์ฟเวอร์เท่านั้น - person wildcat12; 19.04.2018
comment
@ wildcat12 ตอนนี้คุณจะต้องเสียค่าอ่าน 500 ครั้ง เนื่องจากเราไม่ได้ระบุวิธีที่จะบอกว่าให้เฉพาะข้อมูลที่แคชไว้เท่านั้น SDK จะติดตามข้อมูลที่แคชไว้ด้วยการตรวจสอบล่าสุดเสมอ แต่นั่นคือสิ่งที่เรากำลังดำเนินการอยู่ - person Sam Stern; 19.04.2018
comment
@SamStern ยังไม่มีการสนับสนุนสำหรับการสืบค้นแบบแบตช์หรือไม่ - person Dr. C. Hilarius; 03.12.2018
comment
เช่นเดียวกับที่ @FrankvanPuffelen กล่าว การทำสำเนาข้อมูลเป็นเรื่องปกติในฐานข้อมูล NoSQL ที่นี่คุณต้องถามตัวเองว่าข้อมูลเหล่านี้จำเป็นต้องอ่านบ่อยเพียงใด และต้องอัปเดตข้อมูลให้ทันสมัยเพียงใด หากคุณจัดเก็บข้อมูลผู้ใช้ไว้ 500 ราย สมมติว่าชื่อ + รูปภาพ + id ของพวกเขา คุณสามารถอ่านข้อมูลเหล่านั้นได้ในครั้งเดียว แต่หากคุณต้องการให้เป็นข้อมูลล่าสุด คุณอาจต้องใช้ฟังก์ชันคลาวด์เพื่ออัปเดตข้อมูลอ้างอิงเหล่านี้ทุกครั้งที่ผู้ใช้อัปเดตชื่อ/รูปภาพ ดังนั้นให้เรียกใช้ฟังก์ชันคลาวด์ + ดำเนินการเขียนบางอย่าง ไม่มีการใช้งานที่ถูกต้อง / ดีกว่า เพียงแต่ขึ้นอยู่กับกรณีการใช้งานของคุณ - person schankam; 11.06.2019

หากคุณใช้ flutter คุณสามารถทำสิ่งต่อไปนี้:

Firestore.instance.collection('your collection name').where(FieldPath.documentId, whereIn:[list containing multiple document IDs]).getDocuments();

สิ่งนี้จะส่งคืนอนาคตที่มี List<DocumentSnapshot> ซึ่งคุณสามารถวนซ้ำได้ตามที่คุณรู้สึกเหมาะสม

person Monis    schedule 02.06.2020
comment
'รายการที่มีรหัสเอกสารหลายรายการ' สามารถมีได้สูงสุด 10 รายการใช่ไหม - person Krishna Shetty; 22.02.2021

แน่นอนว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือการใช้แบบสอบถามจริงของ Firestore ในฟังก์ชั่นคลาวด์ จากนั้นจะมีการโทรไปกลับเพียงครั้งเดียวจากไคลเอนต์ไปยัง Firebase ซึ่งดูเหมือนว่าจะเป็นสิ่งที่คุณต้องการ

คุณอยากจะรักษาตรรกะการเข้าถึงข้อมูลทั้งหมดของคุณไว้เหมือนกับฝั่งเซิร์ฟเวอร์นี้อยู่แล้ว

ภายในมีแนวโน้มที่จะมีจำนวนการโทรไปยัง Firebase เท่ากัน แต่การโทรทั้งหมดจะผ่านการเชื่อมต่อที่รวดเร็วเป็นพิเศษของ Google แทนที่จะเป็นเครือข่ายภายนอก และเมื่อรวมกับไปป์ไลน์ที่ Frank van Puffelen อธิบายไว้ คุณควรได้รับประสิทธิภาพที่ยอดเยี่ยมจาก แนวทางนี้

person Chris Wilson    schedule 04.03.2018
comment
การจัดเก็บการใช้งานใน Cloud Function เป็นการตัดสินใจที่ถูกต้องในบางกรณีที่คุณมีตรรกะที่ซับซ้อน แต่อาจไม่ใช่ในกรณีที่คุณต้องการรวมรายการที่มีหลาย ID สิ่งที่คุณสูญเสียไปคือการแคชฝั่งไคลเอ็นต์และการจัดรูปแบบการส่งคืนที่เป็นมาตรฐานจากการโทรปกติ สิ่งนี้ทำให้เกิดปัญหาด้านประสิทธิภาพมากกว่าที่แก้ไขได้ในบางกรณีในแอปของฉันเมื่อฉันใช้วิธีการนี้ - person Jeremiah; 07.03.2018

ต่อไปนี้คือวิธีดำเนินการเช่นนี้ใน Kotlin ด้วย Android SDK
อาจไม่จำเป็นต้องเป็นไปกลับครั้งเดียว แต่จัดกลุ่มผลลัพธ์ได้อย่างมีประสิทธิภาพและหลีกเลี่ยงการโทรกลับที่ซ้อนกันจำนวนมาก

val userIds = listOf("123", "456")
val userTasks = userIds.map { firestore.document("users/${it!!}").get() }

Tasks.whenAllSuccess<DocumentSnapshot>(userTasks).addOnSuccessListener { documentList ->
    //Do what you need to with the document list
}

โปรดทราบว่าการดึงเอกสารเฉพาะเจาะจงดีกว่าการดึงเอกสารทั้งหมดแล้วกรองผลลัพธ์ เนื่องจาก Firestore เรียกเก็บเงินคุณสำหรับชุดผลลัพธ์การสืบค้น

person Markymark    schedule 20.08.2019
comment
ทำงานได้ดี ตรงกับสิ่งที่ฉันกำลังมองหา! - person Georgi; 22.09.2019

ฉันหวังว่าสิ่งนี้จะช่วยคุณได้ มันได้ผลสำหรับฉัน

getCartGoodsData(id) {

    const goodsIDs: string[] = [];

    return new Promise((resolve) => {
      this.fs.firestore.collection(`users/${id}/cart`).get()
        .then(querySnapshot => {
          querySnapshot.forEach(doc => {
            goodsIDs.push(doc.id);
          });

          const getDocs = goodsIDs.map((id: string) => {
            return this.fs.firestore.collection('goods').doc(id).get()
              .then((docData) => {
                return docData.data();
              });
          });

          Promise.all(getDocs).then((goods: Goods[]) => {
            resolve(goods);
          });
        });
    });
  }
person Muhammad Mabrouk    schedule 07.11.2019

สำหรับผู้ที่ต้องการใช้ Angular นี่คือตัวอย่าง:

ขั้นแรกจำเป็นต้องนำเข้าไลบรารีบางส่วน: (ต้องติดตั้งไว้ล่วงหน้า)

import * as firebase from 'firebase/app'
import { AngularFirestore, AngularFirestoreCollection } from '@angular/fire/firestore'

การกำหนดค่าบางอย่างสำหรับคอลเลกชัน:

yourCollection: AngularFirestoreCollection;

constructor(
    private _db : AngularFirestore,
) { 
    // this is your firestore collection
    this.yourCollection = this._db.collection('collectionName');
}

นี่คือวิธีการในการสืบค้น: ('products_id' คือ Array of ids)

getProducts(products_ids) {
    var queryId = firebase.firestore.FieldPath.documentId();
    this.yourCollection.ref.where(queryId, 'in', products_ids).get()
        .then(({ docs }) => {
            console.log(docs.map(doc => doc.data()))
        })
}
person Santi Nunez    schedule 25.02.2021

:) เมื่อคุณพบว่าตัวเองใช้มด คุณไม่ล้มเหลวใช่ไหม?
person Horea    schedule 23.12.2017

ใช่มันเป็นไปได้ ตัวอย่างใน .NET SDK สำหรับ Firestore:

/*List of document references, for example:
    FirestoreDb.Collection(ROOT_LEVEL_COLLECTION).Document(DOCUMENT_ID);*/
    List<DocumentReference> docRefList = YOUR_DOCUMENT_REFERENCE_LIST;
    
    // Required fields of documents, not necessary while fetching entire documents
    FieldMask fieldMask = new FieldMask(FIELD-1, FIELD-2, ...);
    
    // With field mask
    List<DocumentSnapshot> documentSnapshotsMasked = await FirestoreDb.GetAllSnapshotsAsync(docRefList, fieldMask);
    
    // Without field mask
    List<DocumentSnapshot>documentSnapshots = await FirestoreDb.GetAllSnapshotsAsync(docRefList);

เอกสารประกอบใน .NET:

  1. รับสแนปชอตทั้งหมด< /ก>

  2. มาสก์ฟิลด์

person Om Palsanawala    schedule 11.06.2021
comment
แม้ว่าลิงก์นี้อาจตอบคำถามได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และเตรียมลิงก์ไว้เพื่อใช้อ้างอิงด้วย คำตอบสำหรับลิงก์เท่านั้นอาจใช้ไม่ได้หากหน้าที่เชื่อมโยงมีการเปลี่ยนแปลง - จากบทวิจารณ์ - person Amir Dora.; 11.06.2021
comment
ใช่ นี่ตอบคำถามได้หมดเลย ฉันยังได้เพิ่มตัวอย่างโค้ดพร้อมกับลิงก์อ้างอิงด้วย - person Om Palsanawala; 11.06.2021

สิ่งที่ดีที่สุดที่คุณสามารถทำได้คือ ไม่ ใช้ Promise.all เนื่องจากไคลเอ็นต์ของคุณต้องรอ .all การอ่านก่อนที่จะดำเนินการต่อ

ทำซ้ำการอ่านและปล่อยให้แก้ไขอย่างอิสระ ในฝั่งไคลเอ็นต์ สิ่งนี้อาจเดือดลงไปที่ UI ที่มีอิมเมจตัวโหลดความคืบหน้าหลายตัวแก้ไขเป็นค่าอย่างอิสระ อย่างไรก็ตาม วิธีนี้ดีกว่าการแช่แข็งไคลเอ็นต์ทั้งหมดจนกว่า .all การอ่านจะได้รับการแก้ไข

ดังนั้น ให้ดัมพ์ผลลัพธ์แบบซิงโครนัสทั้งหมดไปยังมุมมองทันที จากนั้นปล่อยให้ผลลัพธ์แบบอะซิงโครนัสเข้ามาในขณะที่แก้ไขทีละรายการ นี่อาจดูเหมือนเป็นข้อแตกต่างเล็กๆ น้อยๆ แต่หากลูกค้าของคุณมีการเชื่อมต่ออินเทอร์เน็ตที่ไม่ดี (เหมือนกับที่ฉันใช้ที่ร้านกาแฟแห่งนี้ในปัจจุบัน) การหยุดประสบการณ์ของลูกค้าทั้งหมดเป็นเวลาหลายวินาทีจะส่งผลให้ประสบการณ์ 'แอปนี้ห่วย'

person Ronnie Royston    schedule 17.09.2018
comment
เป็นแบบอะซิงโครนัส มีกรณีการใช้งานมากมายสำหรับการใช้ Promise.all... โดยไม่จำเป็นต้องหยุดการทำงานใดๆ เลย คุณอาจต้องรอข้อมูลทั้งหมดก่อนจึงจะสามารถทำอะไรที่มีความหมายได้ - person Ryan Taylor; 08.03.2019
comment
มีกรณีการใช้งานหลายกรณีเมื่อคุณต้องการโหลดข้อมูลทั้งหมดของคุณ ดังนั้น Promise.all จึงจำเป็นต้องรอ (เช่น สปินเนอร์ที่มีข้อความที่เหมาะสม ไม่จำเป็นต้องหยุด UI ใดๆ อย่างที่คุณพูด) ขึ้นอยู่กับว่าคุณกำลังสร้างผลิตภัณฑ์ประเภทใดที่นี่ ความคิดเห็นประเภทนี้เป็นความคิดเห็นของฉันเองที่ไม่เกี่ยวข้องอย่างยิ่งและไม่ควรมีคำพูดที่ดีที่สุดในนั้น ขึ้นอยู่กับกรณีการใช้งานต่างๆ ที่สามารถเผชิญได้ และสิ่งที่แอปของคุณทำเพื่อผู้ใช้ - person schankam; 11.06.2019