Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

مدل Cloud Firestore Data

با مجموعه‌ها، منظم بمانید ذخیره و دسته‌بندی محتوا براساس اولویت‌های شما.

Cloud Firestore یک پایگاه داده NoSQL و سند گرا است. برخلاف پایگاه داده SQL، هیچ جدول یا ردیفی وجود ندارد. در عوض، داده‌ها را در اسناد ذخیره می‌کنید که در مجموعه‌هایی سازماندهی شده‌اند.

هر سند شامل مجموعه ای از جفت های کلید-مقدار است. Cloud Firestore برای ذخیره مجموعه های بزرگ اسناد کوچک بهینه شده است.

تمام اسناد باید در مجموعه ها ذخیره شوند. اسناد می‌توانند شامل مجموعه‌های فرعی و اشیاء تودرتو باشند، که هر دو می‌توانند شامل فیلدهای ابتدایی مانند رشته‌ها یا اشیاء پیچیده مانند فهرست‌ها باشند.

مجموعه ها و اسناد به طور ضمنی در Cloud Firestore ایجاد می شوند. به سادگی داده ها را به یک سند در یک مجموعه اختصاص دهید. اگر مجموعه یا سند وجود نداشته باشد، Cloud Firestore آن را ایجاد می کند.

اسناد

در Cloud Firestore واحد ذخیره سازی سند است. یک سند یک رکورد سبک وزن است که حاوی فیلدهایی است که به مقادیر نگاشت می شوند. هر سند با یک نام مشخص می شود.

سندی که یک کاربر alovelace را نشان می‌دهد ممکن است به شکل زیر باشد:

  • آواریس

    first : "Ada"
    last : "Lovelace"
    born : 1815

به اشیاء پیچیده و تو در تو در یک سند، نقشه می گویند. به عنوان مثال، می توانید نام کاربر را از مثال بالا با یک نقشه ساختار دهید، مانند این:

  • آواریس

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

ممکن است متوجه شوید که اسناد بسیار شبیه JSON هستند. در واقع، آنها اساسا هستند. تفاوت هایی وجود دارد (به عنوان مثال، اسناد از انواع داده های اضافی پشتیبانی می کنند و اندازه آنها به 1 مگابایت محدود است)، اما به طور کلی، می توانید اسناد را به عنوان رکوردهای سبک JSON در نظر بگیرید.

مجموعه ها

اسناد در مجموعه هایی زندگی می کنند که صرفاً محفظه هایی برای اسناد هستند. به عنوان مثال، می‌توانید مجموعه‌ای از users داشته باشید که شامل کاربران مختلف شما باشد که هر کدام با یک سند نشان داده می‌شوند:

  • کاربران

    • آواریس

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • خوانی

      first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore بدون طرح است، بنابراین شما آزادی کاملی در مورد اینکه چه فیلدهایی در هر سند قرار می دهید و چه نوع داده ای در آن فیلدها ذخیره می کنید دارید. اسناد موجود در یک مجموعه می توانند همگی حاوی فیلدهای مختلف باشند یا انواع مختلفی از داده ها را در آن فیلدها ذخیره کنند. با این حال، ایده خوبی است که از فیلدها و انواع داده های یکسان در چندین سند استفاده کنید تا بتوانید اسناد را راحت تر جستجو کنید.

یک مجموعه حاوی اسناد است و هیچ چیز دیگری. نمی‌تواند مستقیماً حاوی فیلدهای خام با مقادیر باشد، و نمی‌تواند شامل مجموعه‌های دیگر باشد. (برای توضیح نحوه ساختار داده های پیچیده تر در Cloud Firestore به داده های سلسله مراتبی مراجعه کنید.)

نام اسناد در یک مجموعه منحصر به فرد است. می‌توانید کلیدهای خود را مانند شناسه‌های کاربری ارائه دهید، یا می‌توانید به Cloud Firestore اجازه دهید به‌طور خودکار شناسه‌های تصادفی را برای شما ایجاد کند.

شما نیازی به "ایجاد" یا "حذف" مجموعه ها ندارید. پس از ایجاد اولین سند در یک مجموعه، مجموعه وجود دارد. اگر تمام اسناد یک مجموعه را حذف کنید، دیگر وجود ندارد.

منابع

هر سند در Cloud Firestore به طور منحصربه‌فرد با مکان آن در پایگاه داده شناسایی می‌شود. مثال قبلی نشان دهنده یک فاصله alovelace در users مجموعه است. برای ارجاع به این مکان در کد خود، می توانید یک مرجع برای آن ایجاد کنید.

Web version 9

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web version 8

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
سریع
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
هدف-C
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
جاوا
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
پایتون
a_lovelace_ref = db.collection(u'users').document(u'alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
برو
alovelaceRef := client.Collection("users").Doc("alovelace")
PHP
$document = $db->collection('samples/php/users')->document('alovelace');
وحدت
DocumentReference documentRef = db.Collection("users").Document("alovelace");
سی شارپ
DocumentReference documentRef = db.Collection("users").Document("alovelace");
روبی
document_ref = firestore.col("users").doc("alovelace")

مرجع یک شی سبک وزن است که فقط به مکانی در پایگاه داده شما اشاره می کند. شما می توانید یک مرجع ایجاد کنید، چه داده در آنجا وجود داشته باشد یا نه، و ایجاد یک مرجع هیچ عملیات شبکه ای را انجام نمی دهد.

همچنین می توانید ارجاعاتی به مجموعه ها ایجاد کنید:

Web version 9

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web version 8

var usersCollectionRef = db.collection('users');
سریع
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
let usersCollectionRef = db.collection("users")
هدف-C
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Java

CollectionReference usersCollectionRef = db.collection("users");

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Dart

final usersCollectionRef = db.collection("users");
جاوا
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
پایتون
users_ref = db.collection(u'users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
برو
usersRef := client.Collection("users")
PHP
$collection = $db->collection('samples/php/users');
وحدت
CollectionReference collectionRef = db.Collection("users");
سی شارپ
CollectionReference collectionRef = db.Collection("users");
روبی
collection_ref = firestore.col "users"

برای راحتی، همچنین می‌توانید با تعیین مسیر یک سند یا مجموعه به‌عنوان یک رشته، ارجاع‌هایی ایجاد کنید که اجزای مسیر با یک اسلش رو به جلو ( / ) از هم جدا شده‌اند. به عنوان مثال، برای ایجاد یک مرجع به سند alovelace :

Web version 9

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web version 8

var alovelaceDocumentRef = db.doc('users/alovelace');
سریع
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
let aLovelaceDocumentReference = db.document("users/alovelace")
هدف-C
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
جاوا
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
پایتون
a_lovelace_ref = db.document(u'users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
برو
alovelaceRef := client.Doc("users/alovelace")
PHP
$document = $db->document('users/alovelace');
وحدت
DocumentReference documentRef = db.Document("users/alovelace");
سی شارپ
DocumentReference documentRef = db.Document("users/alovelace");
روبی
document_path_ref = firestore.doc "users/alovelace"

داده های سلسله مراتبی

برای درک نحوه عملکرد ساختارهای داده سلسله مراتبی در Cloud Firestore، یک نمونه برنامه چت با پیام ها و اتاق های گفتگو را در نظر بگیرید.

می توانید مجموعه ای به نام rooms ها برای ذخیره اتاق های گفتگوی مختلف ایجاد کنید:

  • اتاق

    • اتاق A

      name : "my chat room"

    • B

      ...

اکنون که اتاق های گفتگو دارید، تصمیم بگیرید که چگونه پیام های خود را ذخیره کنید. ممکن است نخواهید آنها را در سند اتاق گفتگو ذخیره کنید. اسناد موجود در Cloud Firestore باید سبک باشند و یک اتاق گفتگو می تواند حاوی تعداد زیادی پیام باشد. با این حال، می توانید مجموعه های اضافی را در سند اتاق چت خود به عنوان مجموعه فرعی ایجاد کنید.

زیر مجموعه ها

بهترین راه برای ذخیره پیام ها در این سناریو استفاده از مجموعه های فرعی است. یک زیر مجموعه مجموعه ای است که با یک سند خاص مرتبط است.

می‌توانید برای هر سند اتاق در مجموعه rooms خود، یک مجموعه فرعی به نام messages ایجاد کنید:

  • اتاق

    • اتاق A

      name : "my chat room"

      • پیام های

        • پیام 1

          from : "alex"
          msg : "Hello World!"

        • پیام 2

          ...

    • B

      ...

در این مثال، شما می توانید یک مرجع به یک پیام در زیر مجموعه با کد زیر ایجاد کنید:

Web version 9

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web version 8

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
سریع
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
هدف-C
توجه: این محصول در اهداف watchOS و App Clip موجود نیست.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Kotlin+KTX

val messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1")

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
جاوا
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
پایتون
room_a_ref = db.collection(u'rooms').document(u'roomA')
message_ref = room_a_ref.collection(u'messages').document(u'message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
برو
messageRef := client.Collection("rooms").Doc("roomA").
	Collection("messages").Doc("message1")
PHP
$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
وحدت
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
سی شارپ
DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
روبی
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

به الگوی متناوب مجموعه ها و اسناد توجه کنید. مجموعه ها و اسناد شما باید همیشه از این الگو پیروی کنند. شما نمی توانید به یک مجموعه در یک مجموعه یا یک سند در یک سند ارجاع دهید.

مجموعه های فرعی به شما امکان می دهند داده ها را به صورت سلسله مراتبی ساختار دهید و دسترسی به داده ها را آسان تر می کند. برای دریافت همه پیام‌ها در roomA ، می‌توانید یک مرجع مجموعه برای messages زیر مجموعه ایجاد کنید و مانند هر مرجع مجموعه دیگری با آن تعامل کنید.

اسناد موجود در مجموعه‌های فرعی می‌توانند شامل مجموعه‌های فرعی نیز باشند، که به شما امکان می‌دهند داده‌های تودرتو بیشتر کنید. می توانید داده ها را تا عمق 100 سطح تودرتو کنید.