Firebase Firestore 'Reference' เป็นประเภทข้อมูลใดดี?


189

ฉันเพียงแค่การสำรวจใหม่ Firebase FireStore referenceและจะมีชนิดของข้อมูลที่เรียกว่า ไม่ชัดเจนสำหรับฉันว่าสิ่งนี้ทำอะไร

  • มันเหมือนกุญแจต่างประเทศหรือไม่
  • มันสามารถใช้เพื่อชี้ไปยังคอลเลกชันที่ตั้งอยู่ที่อื่นได้หรือไม่?
  • หากreferenceเป็นการอ้างอิงจริงฉันสามารถใช้มันเพื่อการสืบค้นได้หรือไม่? ตัวอย่างเช่นฉันสามารถมีการอ้างอิงที่ชี้ไปยังผู้ใช้โดยตรงแทนที่จะเก็บ userId ในช่องข้อความ? และฉันสามารถใช้การอ้างอิงผู้ใช้นี้สำหรับการสืบค้นได้หรือไม่?

18
ฉันคิดว่าวิดีโอนี้จากทีม firebase แบ่งให้คุณ: youtube.com/watch?v=Elg2zDVIcLo (ดูจาก 4:36)
Adarsh

คำตอบ:


91

การอ้างอิงเป็นอย่างมากเหมือนกุญแจต่างประเทศ

SDK ที่วางจำหน่ายในปัจจุบันไม่สามารถจัดเก็บการอ้างอิงถึงโครงการอื่น ๆ ภายในโครงการการอ้างอิงสามารถชี้ไปที่เอกสารอื่นใดในการรวบรวมอื่น ๆ

คุณสามารถใช้การอ้างอิงในแบบสอบถามเช่นค่าอื่น ๆ : สำหรับการกรองการสั่งซื้อและสำหรับการเพจ (startAt / startAfter)

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


9
กรุณาคุณสามารถแบ่งปันกรณีการใช้ที่เป็นไปได้? เป็นไปได้หรือไม่ที่จะสืบค้นเขตข้อมูลในการอ้างอิงนั้น เช่นฉันมีรายการfriendsคอลเลกชันเพื่อนของฉันทั้งหมด ( friends/myId) จากนั้นฉันอ้างอิงเอกสารนี้ในfriendsฟิลด์ของเอกสารอื่น ( group/groupId) where('friends.myId', '==', true)ผมอยากจะแสดงเฉพาะเพื่อนของฉันที่อยู่ในกลุ่มที่ทำอะไรเช่นนี้
จะ

108
แต่อาจเป็นประโยชน์ในการอัปเดตเอกสารเพื่อรวมตัวอย่างของการเพิ่มประเภทการอ้างอิง
จะ

11
ฉันหาข้อมูลเกี่ยวกับเรื่องนี้ไม่ได้? นี้จะเปลี่ยนโครงสร้างฐานข้อมูลของฉันทั้งหมดที่ฉันต้องการทราบข้อมูลเพิ่มเติม ...
Ruben

3
คุณมีตัวอย่าง (ควรเป็นแบบรวดเร็วหรือไม่) ในการสืบค้นโดยใช้การอ้างอิง ตอนนี้ฉันสามารถทำได้โดยการจัดเก็บ uid ดิบเป็นสตริง แต่ดูเหมือนจะไม่ถูกต้อง
มิกกี้ชอง

6
ฉันต้องการเปลี่ยนประเภทการอ้างอิงของฉันทั้งหมดเป็นสตริงเนื่องจากแบบสอบถามจะล้มเหลวเสมอกับประเภทการอ้างอิง ฉันไม่พบสิ่งใดเกี่ยวกับวิธีการสืบค้นตามประเภทการอ้างอิงอย่างแท้จริง :( หากใครค้นพบวิธีการสืบค้นตามประเภทการอ้างอิงแจ้งให้ฉันทราบ ...
Sam Trent

133

เพิ่มด้านล่างสิ่งที่ทำงานสำหรับฉันโดยใช้การอ้างอิงใน Firestore

ในขณะที่คำตอบอื่น ๆ บอกว่ามันเหมือนกุญแจต่างประเทศ แอตทริบิวต์การอ้างอิงไม่ส่งคืนข้อมูลของเอกสารอ้างอิงแม้ว่า ตัวอย่างเช่นฉันมีรายการผลิตภัณฑ์ที่มีการอ้างอิง userRef เป็นหนึ่งในคุณลักษณะของผลิตภัณฑ์ รับรายการผลิตภัณฑ์ให้ฉันอ้างอิงของผู้ใช้ที่สร้างผลิตภัณฑ์นั้น แต่มันไม่ได้ให้รายละเอียดของผู้ใช้ในการอ้างอิงนั้น ฉันใช้แบ็คเอนด์อื่น ๆ เป็นบริการที่มีพอยน์เตอร์ก่อนหน้านี้ที่มีธง "populate: true" ที่ให้รายละเอียดผู้ใช้กลับมาแทนที่จะเป็นเพียง id อ้างอิงของผู้ใช้ซึ่งจะดีมากหากได้มาที่นี่ )

ด้านล่างนี้คือตัวอย่างรหัสที่ฉันใช้ในการตั้งค่าการอ้างอิงรวมถึงการรวบรวมรายการผลิตภัณฑ์จากนั้นรับรายละเอียดผู้ใช้จากรหัสอ้างอิงผู้ใช้ที่ระบุ

ตั้งค่าการอ้างอิงในคอลเล็กชัน:

let data = {
  name: 'productName',
  size: 'medium',
  userRef: db.doc('users/' + firebase.auth().currentUser.uid)
};
db.collection('products').add(data);

รับคอลเล็กชัน (ผลิตภัณฑ์) และการอ้างอิงทั้งหมดในแต่ละเอกสาร (รายละเอียดผู้ใช้):

db.collection('products').get()
    .then(res => {
      vm.mainListItems = [];
      res.forEach(doc => {
        let newItem = doc.data();
        newItem.id = doc.id;
        if (newItem.userRef) {
          newItem.userRef.get()
          .then(res => { 
            newItem.userData = res.data() 
            vm.mainListItems.push(newItem);
          })
          .catch(err => console.error(err));
        } else {
          vm.mainListItems.push(newItem);  
        }

      });
    })
    .catch(err => { console.error(err) });

หวังว่านี่จะช่วยได้


3
ขอบคุณสำหรับการแบ่งปัน! db.collection('products').get()ผมคิดว่ามีการพิมพ์ผิดในบรรทัดแรกของการมีส่วนร่วมรับและมันควรจะเป็น คุณลองรับผู้ใช้โดยตรงหรือไม่ ฉันคาดเดาว่าnewItem.userRef.get()ควรจะทำงานแทนdb.collection("users").doc(newItem.userRef.id).get()
Sergey Nefedyev

53
ก่อนอื่นขอขอบคุณสำหรับตัวอย่าง ฉันหวังว่าพวกเขาจะเพิ่ม "ประชากร: จริง" สำหรับอนาคต มิฉะนั้นการบันทึกการอ้างอิงนั้นค่อนข้างไม่มีจุดหมาย สิ่งเดียวกันสามารถทำได้โดยเพียงแค่บันทึกuidและอ้างอิงผ่านมัน
Jürgen Brandstetter

4
ขอบคุณสำหรับตัวอย่าง! แต่อะไรคือจุดเก็บประเภทอ้างอิงถ้าไม่มีตัวเลือก "เติมข้อมูล" เมื่อเราทำการสืบค้นเอกสาร? หากมีตัวเลือกการเติมข้อมูลที่ทุกคนรู้โปรดแจ้งให้เราทราบ
Harshil Shah

18
ดังนั้นในความเป็นจริงมันไม่เหมือนกุญแจต่างประเทศ สำหรับฉันแล้วมันไม่ทำอะไรเลย - สิ่งที่มีอยู่referenceหากเราไม่สามารถใช้มันเป็นรหัสต่างประเทศที่แท้จริงควรใช้งานได้?
jean d'arme

14
ดังนั้นประโยชน์เฉพาะของreferenceมากกว่าstringคือว่าคุณสามารถโทรget()ในการอ้างอิงโดยตรง ยังไม่มีประโยชน์มาก หวังว่าพวกเขาจะเพิ่มตัวเลือกในการเติมข้อมูลอ้างอิงโดยอัตโนมัติกับวัตถุที่เกี่ยวข้อง!
morgler

16

สำหรับผู้ที่มองหาโซลูชัน Javascript เพื่อทำการสืบค้นโดยอ้างอิง - แนวคิดคือคุณต้องใช้วัตถุ 'การอ้างอิงเอกสาร' ในคำสั่งการสืบค้น

teamDbRef = db.collection('teams').doc('CnbasS9cZQ2SfvGY2r3b'); /* CnbasS9cZQ2SfvGY2r3b being the collection ID */
//
//
db.collection("squad").where('team', '==', teamDbRef).get().then((querySnapshot) => {
  //
}).catch(function(error) {
  //
});

(ความรุ่งโรจน์ของคำตอบที่นี่: https://stackoverflow.com/a/53141199/1487867 )

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.