Catch up on everything we announced at this year's Firebase Summit. Learn more

Veri Alma

Bu belge, veritabanı verilerini almanın temellerini, verilerin nasıl sıralandığını ve veriler üzerinde basit sorguların nasıl gerçekleştirileceğini kapsar. Yönetici SDK'sındaki veri alma, farklı programlama dillerinde biraz farklı şekilde uygulanır.

  1. Asenkron dinleyiciler: Bir Firebase Gerçek Zamanlı veritabanında saklanan veriler bir veri tabanı referansına uyumsuz bir dinleyici takılarak alınır. Dinleyici, verilerin ilk durumu için bir kez ve veriler değiştiğinde yeniden tetiklenir. Bir olay dinleyicisi birkaç farklı alabilirsiniz olay türlerini . Bu veri alma modu Java, Node.js ve Python Admin SDK'larında desteklenir.
  2. Okur engelleme: bir Firebase reel zamanlı veri tabanına kayıtlı veriler referans saklanan veri döndüren bir veri tabanı referansı, bir engelleme yöntemi çağırarak alınır. Her yöntem çağrısı bir kerelik bir işlemdir. Bu, SDK'nın sonraki veri güncellemelerini dinleyen herhangi bir geri arama kaydetmediği anlamına gelir. Bu veri alma modeli Python ve Go Admin SDK'larında desteklenir.

Başlarken

Bir Firebase veritabanından verilerin nasıl okunacağını anlamak için önceki makaledeki blog örneğini tekrar gözden geçirelim. Örnek uygulamasında blog yayınları veritabanında URL saklanmasıdır Hatırlama https://docs-examples.firebaseio.com/server/saving-data/fireblog/posts.json . Gönderi verilerinizi okumak için aşağıdakileri yapabilirsiniz:

Java
public static class Post {

  public String author;
  public String title;

  public Post(String author, String title) {
    // ...
  }

}

// Get a reference to our posts
final FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference ref = database.getReference("server/saving-data/fireblog/posts");

// Attach a listener to read the data at our posts reference
ref.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    Post post = dataSnapshot.getValue(Post.class);
    System.out.println(post);
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    System.out.println("The read failed: " + databaseError.getCode());
  }
});
Node.js
// Get a database reference to our posts
const db = getDatabase();
const ref = db.ref('server/saving-data/fireblog/posts');

// Attach an asynchronous callback to read the data at our posts reference
ref.on('value', (snapshot) => {
  console.log(snapshot.val());
}, (errorObject) => {
  console.log('The read failed: ' + errorObject.name);
}); 
piton
# Import database module.
from firebase_admin import db

# Get a database reference to our posts
ref = db.reference('server/saving-data/fireblog/posts')

# Read the data at the posts reference (this is a blocking operation)
print(ref.get())
Gitmek

// Post is a json-serializable type.
type Post struct {
	Author string `json:"author,omitempty"`
	Title  string `json:"title,omitempty"`
}

// Create a database client from App.
client, err := app.Database(ctx)
if err != nil {
	log.Fatalln("Error initializing database client:", err)
}

// Get a database reference to our posts
ref := client.NewRef("server/saving-data/fireblog/posts")

// Read the data at the posts reference (this is a blocking operation)
var post Post
if err := ref.Get(ctx, &post); err != nil {
	log.Fatalln("Error reading value:", err)
}

Yukarıdaki kodu çalıştırırsanız, konsola kaydedilen tüm gönderilerinizi içeren bir nesne göreceksiniz. Node.js ve Java söz konusu olduğunda, veritabanı referansınıza her yeni veri eklendiğinde dinleyici işlevi çağrılır ve bunun gerçekleşmesi için herhangi bir ekstra kod yazmanız gerekmez.

Java ve node.js olarak, geri arama işlevi alır DataSnapshot veri anlık bir. Anlık görüntü, zaman içinde tek bir noktada belirli bir veritabanı referansındaki verilerin bir resmidir. Arayan val() / getValue() bir veri dile özgü nesne temsili bir anlık döner. Bir veri referansın konumda bulunuyorsa, bu anlık değeri olan null . get() Python yöntem, doğrudan veri Python temsilini verir. Get() Go işlevi belirli bir veri yapısı içine veri unmarshals.

Kullandığımız olduğuna dikkat edin value verilerin sadece bir parça değişmiş olsa bile, bir Firebase veritabanı referans tüm içeriği okur yukarıdaki örnekte olay türünü. value Eğer veritabanından veri okumak için kullanabileceği aşağıda listelenen beş farklı olay türlerinden biridir.

Java ve Node.js'de Olay Türlerini Okuyun

Değer

value onlar okuma etkinliği sırasında varolan gibi olay, belirli bir veritabanı yolu üstündeki içindekiler statik anlık okumak için kullanılır. İlk verilerle bir kez ve veriler her değiştiğinde tekrar tetiklenir. Olay geri çağrısı, alt veriler de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntüden geçirilir. Yukarıdaki kod örneğinde, value uygulamanızda blog gönderisi tüm döndü. Her yeni blog yazısı eklendiğinde, geri arama işlevi tüm yazıları döndürür.

Çocuk Eklendi

child_added veritabanından öğelerin listesini alınırken olay genellikle kullanılır. Aksine value konumu tüm içeriğini döndürür child_added yine sonra yeni bir çocuk belirtilen yolda eklenen her zaman mevcut her çocuk için bir kere tetiklenir ve. Olay geri çağrısı, yeni alt öğenin verilerini içeren bir anlık görüntüye iletilir. Sıralama amacıyla, önceki çocuğun anahtarını içeren ikinci bir argüman da iletilir.

Eğer bloglama uygulamaya eklenen her yeni yayında sadece veri almak istiyorsanız, size kullanın olabilir child_added :

Java
ref.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    Post newPost = dataSnapshot.getValue(Post.class);
    System.out.println("Author: " + newPost.author);
    System.out.println("Title: " + newPost.title);
    System.out.println("Previous Post ID: " + prevChildKey);
  }

  @Override
  public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onChildRemoved(DataSnapshot dataSnapshot) {}

  @Override
  public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onCancelled(DatabaseError databaseError) {}
});
Node.js
// Retrieve new posts as they are added to our database
ref.on('child_added', (snapshot, prevChildKey) => {
  const newPost = snapshot.val();
  console.log('Author: ' + newPost.author);
  console.log('Title: ' + newPost.title);
  console.log('Previous Post ID: ' + prevChildKey);
});

Bu örnekte anlık görüntü, bireysel bir blog gönderisine sahip bir nesne içerecektir. SDK değerini alarak nesnelere mesajları dönüştürür olduğundan, arayarak yayının yazar ve başlık özelliklerine erişebilir author ve title sırasıyla. Ayrıca ikinci, önceki sonrası ID erişimi olan prevChildKey argüman.

Çocuk Değiştirildi

child_changed olay Bir çocuk düğüm değiştirildiğinde her zaman tetiklenir. Bu, alt düğümün alt öğelerinde yapılan tüm değişiklikleri içerir. İle Genellikle birlikte kullanılır child_added ve child_removed öğelerin bir listesini değişikliklere yanıt verdiklerini. Olay geri çağrısına geçirilen anlık görüntü, alt öğe için güncellenmiş verileri içerir.

Sen kullanabilirsiniz child_changed onlar düzenlendiğinde blog gönderileri güncellenen veri okumak için:

Java
ref.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {
    Post changedPost = dataSnapshot.getValue(Post.class);
    System.out.println("The updated post title is: " + changedPost.title);
  }

  @Override
  public void onChildRemoved(DataSnapshot dataSnapshot) {}

  @Override
  public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onCancelled(DatabaseError databaseError) {}
});
Node.js
// Get the data on a post that has changed
ref.on('child_changed', (snapshot) => {
  const changedPost = snapshot.val();
  console.log('The updated post title is ' + changedPost.title);
});

Çocuk Kaldırıldı

child_removed Bir alt düzey kaldırıldığında olay tetiklenir. İle Tipik olarak birlikte kullanılır child_added ve child_changed . Olay geri çağrısına geçirilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

Blog örnekte, kullanabilirsiniz child_removed konsola silinen yazı hakkında bir bildirim oturum açmak için:

Java
ref.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onChildChanged(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onChildRemoved(DataSnapshot dataSnapshot) {
    Post removedPost = dataSnapshot.getValue(Post.class);
    System.out.println("The blog post titled " + removedPost.title + " has been deleted");
  }

  @Override
  public void onChildMoved(DataSnapshot dataSnapshot, String prevChildKey) {}

  @Override
  public void onCancelled(DatabaseError databaseError) {}
});
Node.js
// Get a reference to our posts
const ref = db.ref('server/saving-data/fireblog/posts');

// Get the data on a post that has been removed
ref.on('child_removed', (snapshot) => {
  const deletedPost = snapshot.val();
  console.log('The blog post titled \'' + deletedPost.title + '\' has been deleted');
});

Çocuk Taşındı

child_moved kaplıdır sıralı veriler, çalışırken olay kullanılır sonraki bölümde .

Etkinlik Garantileri

Firebase veritabanı, olaylarla ilgili birkaç önemli garanti verir:

Veritabanı Olay Garantileri
Yerel durum değiştiğinde olaylar her zaman tetiklenir.
Yerel işlemler veya zamanlamanın geçici ağ bağlantısı kaybı gibi geçici farklılıklara neden olduğu durumlarda bile, olaylar her zaman sonunda verilerin doğru durumunu yansıtacaktır.
Tek bir istemciden gelen yazmalar her zaman sunucuya yazılır ve sırayla diğer kullanıcılara yayınlanır.
Değer olayları her zaman en son tetiklenir ve o anlık görüntü alınmadan önce meydana gelen diğer olaylardan güncellemeleri içermesi garanti edilir.

Değer olayları her zaman en son tetiklendiğinden, aşağıdaki örnek her zaman işe yarar:

Java
final AtomicInteger count = new AtomicInteger();

ref.addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    // New child added, increment count
    int newCount = count.incrementAndGet();
    System.out.println("Added " + dataSnapshot.getKey() + ", count is " + newCount);
  }

  // ...
});

// The number of children will always be equal to 'count' since the value of
// the dataSnapshot here will include every child_added event triggered before this point.
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    long numChildren = dataSnapshot.getChildrenCount();
    System.out.println(count.get() + " == " + numChildren);
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {}
});
Node.js
let count = 0;

ref.on('child_added', (snap) => {
  count++;
  console.log('added:', snap.key);
});

// length will always equal count, since snap.val() will include every child_added event
// triggered before this point
ref.once('value', (snap) => {
  console.log('initial data loaded!', snap.numChildren() === count);
});

Geri Aramaları Ayırmak

Geri aramalar, aşağıdaki gibi, kaldırılacak olay türü ve geri arama işlevi belirtilerek kaldırılır:

Java
// Create and attach listener
ValueEventListener listener = new ValueEventListener() {
    // ...
};
ref.addValueEventListener(listener);

// Remove listener
ref.removeEventListener(listener);
Node.js
ref.off('value', originalCallback);

Eğer içine bir kapsam bağlamı geçti ise on() geri arama sökerken, o geçmiş olması gerekir:

Java
// Not applicable for Java
Node.js
ref.off('value', originalCallback, ctx);

Bir konumdaki tüm geri aramaları kaldırmak isterseniz aşağıdakileri yapabilirsiniz:

Java
// No Java equivalent, listeners must be removed individually.
Node.js
// Remove all value callbacks
ref.off('value');

// Remove all callbacks of any type
ref.off();

Verileri Bir Kez Okumak

Bazı durumlarda, bir geri aramanın bir kez çağrılması ve ardından hemen kaldırılması yararlı olabilir. Bunu kolaylaştırmak için bir yardımcı fonksiyon oluşturduk:

Java
ref.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    // ...
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    // ...
  }
});
Node.js
ref.once('value', (data) => {
  // do some stuff once
});
piton
# Import database module.
from firebase_admin import db

# Get a database reference to our posts
ref = db.reference('server/saving-data/fireblog/posts')

# Read the data at the posts reference (this is a blocking operation)
print(ref.get())
Gitmek
// Create a database client from App.
client, err := app.Database(ctx)
if err != nil {
	log.Fatalln("Error initializing database client:", err)
}

// Get a database reference to our posts
ref := client.NewRef("server/saving-data/fireblog/posts")

// Read the data at the posts reference (this is a blocking operation)
var post Post
if err := ref.Get(ctx, &post); err != nil {
	log.Fatalln("Error reading value:", err)
}

Veri Sorgulama

Firebase veritabanı sorgularıyla, çeşitli faktörlere dayalı olarak verileri seçerek alabilirsiniz. Veritabanınızda bir sorgu oluşturmak için, size veri sipariş işlevlerden birini kullanarak sipariş olmak istiyorum nasıl belirterek başlayın: orderByChild() , orderByKey() veya orderByValue() . Daha sonra karmaşık sorgular yürütmek üzere beş diğer yöntemlerle bu birleştirebilirsiniz: limitToFirst() , limitToLast() , startAt() , endAt() ve equalTo() .

Firebase'de hepimiz dinozorların oldukça havalı olduğunu düşündüğümüzden, Firebase veritabanınızdaki verileri nasıl sorgulayabileceğinizi göstermek için dinozor gerçeklerinden oluşan örnek bir veritabanından bir pasaj kullanacağız.:

{
  "lambeosaurus": {
    "height" : 2.1,
    "length" : 12.5,
    "weight": 5000
  },
  "stegosaurus": {
    "height" : 4,
    "length" : 9,
    "weight" : 2500
  }
}

Üç şekilde veri sipariş edebilirsiniz: çocuk anahtar ile, anahtar ile veya değerine göre. Temel bir veritabanı sorgusu, her biri aşağıda açıklanan bu sıralama işlevlerinden biriyle başlar.

Belirtilen bir alt anahtara göre sıralama

Sen o tuşa geçirerek ortak bir çocuk anahtar ile düğümleri sipariş edebilirsiniz orderByChild() . Örneğin, boylarına göre sıralanmış tüm dinozorları okumak için aşağıdakileri yapabilirsiniz:

Java
public static class Dinosaur {

  public int height;
  public int weight;

  public Dinosaur(int height, int weight) {
    // ...
  }

}

final DatabaseReference dinosaursRef = database.getReference("dinosaurs");
dinosaursRef.orderByChild("height").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    Dinosaur dinosaur = dataSnapshot.getValue(Dinosaur.class);
    System.out.println(dataSnapshot.getKey() + " was " + dinosaur.height + " meters tall.");
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');

ref.orderByChild('height').on('child_added', (snapshot) => {
  console.log(snapshot.key + ' was ' + snapshot.val().height + ' meters tall');
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('height').get()
for key, val in snapshot.items():
    print('{0} was {1} meters tall'.format(key, val))
Gitmek

// Dinosaur is a json-serializable type.
type Dinosaur struct {
	Height int `json:"height"`
	Width  int `json:"width"`
}

ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("height").GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	var d Dinosaur
	if err := r.Unmarshal(&d); err != nil {
		log.Fatalln("Error unmarshaling result:", err)
	}
	fmt.Printf("%s was %d meteres tall", r.Key(), d.Height)
}

Üzerinde sorguladığınız çocuk anahtarı olmayan tüm düğüm değeri ile sıralanır null o sıralamada ilk gelecektir yani. Veri sıralanır ilgili ayrıntılar için bkz Nasıl Veri bölümüne Sıralı edilir .

Sorgular, yalnızca bir alt düzeydeki çocuklar yerine, derinlemesine yuvalanmış çocuklar tarafından da sipariş edilebilir. Bu, aşağıdaki gibi derinlemesine iç içe geçmiş verileriniz varsa kullanışlıdır:

{
  "lambeosaurus": {
    "dimensions": {
      "height" : 2.1,
      "length" : 12.5,
      "weight": 5000
    }
  },
  "stegosaurus": {
    "dimensions": {
      "height" : 4,
      "length" : 9,
      "weight" : 2500
    }
  }
}

Yüksekliği şimdi sorgulamak için, tek bir anahtar yerine nesnenin tam yolunu kullanabilirsiniz:

Java
dinosaursRef.orderByChild("dimensions/height").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    // ...
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByChild('dimensions/height').on('child_added', (snapshot) => {
  console.log(snapshot.key + ' was ' + snapshot.val().height + ' meters tall');
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('dimensions/height').get()
for key, val in snapshot.items():
    print('{0} was {1} meters tall'.format(key, val))
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("dimensions/height").GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	var d Dinosaur
	if err := r.Unmarshal(&d); err != nil {
		log.Fatalln("Error unmarshaling result:", err)
	}
	fmt.Printf("%s was %d meteres tall", r.Key(), d.Height)
}

Sorgular aynı anda yalnızca bir tuşa göre sipariş verebilir. Arayan orderByChild() aynı sorguda birden çok kez hata verir.

Anahtara göre sıralama

Ayrıca kullanarak tuşları ile düğümleri sipariş edebilirsiniz orderByKey() yöntemini. Aşağıdaki örnek, tüm dinozorları alfabetik sırayla okur:

Java
dinosaursRef.orderByKey().addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
var ref = db.ref('dinosaurs');
ref.orderByKey().on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_key().get()
print(snapshot)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByKey().GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
snapshot := make([]Dinosaur, len(results))
for i, r := range results {
	var d Dinosaur
	if err := r.Unmarshal(&d); err != nil {
		log.Fatalln("Error unmarshaling result:", err)
	}
	snapshot[i] = d
}
fmt.Println(snapshot)

Değere göre sıralama

Sen kullanarak çocuklarının tuşlarının değerine göre düğümleri sipariş edebilirsiniz orderByValue() yöntemini. Diyelim ki dinozorlar bir dino sporları yarışması yapıyorlar ve siz onların skorlarını aşağıdaki formatta takip ediyorsunuz:

{
  "scores": {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21,
    "linhenykus" : 80,
    "pterodactyl" : 93,
    "stegosaurus" : 5,
    "triceratops" : 22
  }
}

Dinozorları puanlarına göre sıralamak için aşağıdaki sorguyu oluşturabilirsiniz:

Java
DatabaseReference scoresRef = database.getReference("scores");
scoresRef.orderByValue().addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println("The " + dataSnapshot.getKey() + " score is " + dataSnapshot.getValue());
  }

  // ...
});
Node.js
const scoresRef = db.ref('scores');
scoresRef.orderByValue().on('value', (snapshot) => {
  snapshot.forEach((data) => {
    console.log('The ' + data.key + ' dinosaur\'s score is ' + data.val());
  });
});
piton
ref = db.reference('scores')
snapshot = ref.order_by_value().get()
for key, val in snapshot.items():
    print('The {0} dinosaur\'s score is {1}'.format(key, val))
Gitmek
ref := client.NewRef("scores")

results, err := ref.OrderByValue().GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	var score int
	if err := r.Unmarshal(&score); err != nil {
		log.Fatalln("Error unmarshaling result:", err)
	}
	fmt.Printf("The %s dinosaur's score is %d\n", r.Key(), score)
}

Bkz Nasıl Veri Sıralı olduğu konusunda bir açıklama için bölüm null kullanılırken, boolean, string ve nesne değerleri sıralanır orderByValue() .

Karmaşık Sorgular

Artık veri sipariş nasıl çok açıktır ki, sen sınırı kullanın veya yöntemleri daha karmaşık sorgular oluşturmak için aşağıda açıklanan değişebilir.

Sorguları Sınırla

limitToFirst() ve limitToLast() sorguları çocukların maksimum sayısını ayarlamak için kullanılır verilen bir geri arama için senkronize edilmek üzere. 100'le bir limit ayarlarsanız, başlangıçta yalnızca 100 kadar alacak child_added olaylar. Eğer veritabanında saklanan 100'den az mesajlar varsa, bir child_added olay her mesaj için tetiklenir. Eğer üzerinde 100 mesaj varsa Ancak, sadece bir alacak child_added bu mesajların 100 uygun etkinliği. Bunlar kullanıyorsanız ilk 100 sipariş mesajlardır limitToFirst() kullandığınız takdirde veya son 100 sipariş mesajları limitToLast() . Ürün değiştirdikçe, alacak child_added sorgu ve girmek öğeler için olayları child_removed , bırakın öğeler için olayları böylece 100'de toplam sayısı kalır.

Dinozor gerçekler veritabanı ve kullanma orderByChild() , iki ağır dinozorları bulabilirsiniz:

Java
dinosaursRef.orderByChild("weight").limitToLast(2).addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByChild('weight').limitToLast(2).on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('weight').limit_to_last(2).get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("weight").LimitToLast(2).GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

child_added veritabanında saklanan ikiden az dinozorlar olmadığı sürece geri arama, tam iki kez tetiklenir. Ayrıca veritabanına eklenen her yeni, daha ağır dinozor için kovulacak. Python'da, sorgu doğrudan döner OrderedDict iki ağır dinozorlar ihtiva etmektedir.

Benzer şekilde, kullanarak iki kısa dinozorlar bulabilirsiniz limitToFirst() :

Java
dinosaursRef.orderByChild("weight").limitToFirst(2).addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByChild('height').limitToFirst(2).on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('height').limit_to_first(2).get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("height").LimitToFirst(2).GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

child_added veritabanında saklanan ikiden az dinozorlar olmadığı sürece geri arama, tam iki kez tetiklenir. Ayrıca, ilk iki dinozordan biri veri tabanından kaldırılırsa, yeni bir dinozor şimdi ikinci en kısa olacağı için tekrar kovulacak. Python'da, sorgu doğrudan döner OrderedDict kısa dinozorlar ihtiva etmektedir.

Ayrıca ile sınır sorguları gerçekleştirebilirsiniz orderByValue() . En yüksek puan alan 3 dino spor dinozorunun yer aldığı bir lider tablosu oluşturmak istiyorsanız, aşağıdakileri yapabilirsiniz:

Java
scoresRef.orderByValue().limitToFirst(3).addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println("The " + dataSnapshot.getKey() + " score is " + dataSnapshot.getValue());
  }

  // ...
});
Node.js
const scoresRef = db.ref('scores');
scoresRef.orderByValue().limitToLast(3).on('value', (snapshot)  =>{
  snapshot.forEach((data) => {
    console.log('The ' + data.key + ' dinosaur\'s score is ' + data.val());
  });
});
piton
scores_ref = db.reference('scores')
snapshot = scores_ref.order_by_value().limit_to_last(3).get()
for key, val in snapshot.items():
    print('The {0} dinosaur\'s score is {1}'.format(key, val))
Gitmek
ref := client.NewRef("scores")

results, err := ref.OrderByValue().LimitToLast(3).GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	var score int
	if err := r.Unmarshal(&score); err != nil {
		log.Fatalln("Error unmarshaling result:", err)
	}
	fmt.Printf("The %s dinosaur's score is %d\n", r.Key(), score)
}

Aralık Sorguları

Kullanılması startAt() , endAt() ve equalTo() Eğer sorguları için keyfi başlangıç ve bitiş noktalarını seçmenize olanak verir. Eğer en az üç metre boyunda bütün dinozorları bulmak istiyorsa Örneğin, sen birleştirebilirsiniz orderByChild() ve startAt() :

Java
dinosaursRef.orderByChild("height").startAt(3).addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByChild('height').startAt(3).on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('height').start_at(3).get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("height").StartAt(3).GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

Sen kullanabilirsiniz endAt() isimleri sözlük sırasında Pterodaktil önce gelen bütün dinozorlar bulmak için:

Java
dinosaursRef.orderByKey().endAt("pterodactyl").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByKey().endAt('pterodactyl').on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_key().end_at('pterodactyl').get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByKey().EndAt("pterodactyl").GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

Birleştirebilirsiniz startAt() ve endAt() Sorgunuzun iki ucunu sınırlamak için. Aşağıdaki örnek, adı "b" harfiyle başlayan tüm dinozorları bulur:

Java
dinosaursRef.orderByKey().startAt("b").endAt("b\uf8ff").addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
var ref = db.ref('dinosaurs');
ref.orderByKey().startAt('b').endAt('b\uf8ff').on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_key().start_at('b').end_at(u'b\uf8ff').get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByKey().StartAt("b").EndAt("b\uf8ff").GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

equalTo() metodu tam eşleşmeler dayalı filtreleme olanağı tanır. Diğer aralık sorgularında olduğu gibi, eşleşen her alt düğüm için tetiklenir. Örneğin, 25 metre boyundaki tüm dinozorları bulmak için aşağıdaki sorguyu kullanabilirsiniz:

Java
dinosaursRef.orderByChild("height").equalTo(25).addChildEventListener(new ChildEventListener() {
  @Override
  public void onChildAdded(DataSnapshot dataSnapshot, String prevChildKey) {
    System.out.println(dataSnapshot.getKey());
  }

  // ...
});
Node.js
const ref = db.ref('dinosaurs');
ref.orderByChild('height').equalTo(25).on('child_added', (snapshot) => {
  console.log(snapshot.key);
});
piton
ref = db.reference('dinosaurs')
snapshot = ref.order_by_child('height').equal_to(25).get()
for key in snapshot:
    print(key)
Gitmek
ref := client.NewRef("dinosaurs")

results, err := ref.OrderByChild("height").EqualTo(25).GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
for _, r := range results {
	fmt.Println(r.Key())
}

Aralık sorguları, verilerinizi sayfalandırmanız gerektiğinde de yararlıdır.

Hepsini bir araya koy

Karmaşık sorgular oluşturmak için tüm bu teknikleri birleştirebilirsiniz. Örneğin, Stegosaurus'tan biraz daha kısa olan dinozorun adını bulabilirsiniz:

Java
dinosaursRef.child("stegosaurus").child("height").addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot stegoHeightSnapshot) {
    Integer favoriteDinoHeight = stegoHeightSnapshot.getValue(Integer.class);
    Query query = dinosaursRef.orderByChild("height").endAt(favoriteDinoHeight).limitToLast(2);
    query.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        // Data is ordered by increasing height, so we want the first entry
        DataSnapshot firstChild = dataSnapshot.getChildren().iterator().next();
        System.out.println("The dinosaur just shorter than the stegosaurus is: " + firstChild.getKey());
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        // ...
      }
    });
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    // ...
  }
});
Node.js
  const ref = db.ref('dinosaurs');
  ref.child('stegosaurus').child('height').on('value', (stegosaurusHeightSnapshot) => {
    const favoriteDinoHeight = stegosaurusHeightSnapshot.val();

    const queryRef = ref.orderByChild('height').endAt(favoriteDinoHeight).limitToLast(2);
    queryRef.on('value', (querySnapshot) => {
      if (querySnapshot.numChildren() === 2) {
        // Data is ordered by increasing height, so we want the first entry
        querySnapshot.forEach((dinoSnapshot) => {
          console.log('The dinosaur just shorter than the stegasaurus is ' + dinoSnapshot.key);

          // Returning true means that we will only loop through the forEach() one time
          return true;
        });
      } else {
        console.log('The stegosaurus is the shortest dino');
      }
    });
});
piton
ref = db.reference('dinosaurs')
favotire_dino_height = ref.child('stegosaurus').child('height').get()
query = ref.order_by_child('height').end_at(favotire_dino_height).limit_to_last(2)
snapshot = query.get()
if len(snapshot) == 2:
    # Data is ordered by increasing height, so we want the first entry.
    # Second entry is stegosarus.
    for key in snapshot:
        print('The dinosaur just shorter than the stegosaurus is {0}'.format(key))
        return
else:
    print('The stegosaurus is the shortest dino')
Gitmek
ref := client.NewRef("dinosaurs")

var favDinoHeight int
if err := ref.Child("stegosaurus").Child("height").Get(ctx, &favDinoHeight); err != nil {
	log.Fatalln("Error querying database:", err)
}

query := ref.OrderByChild("height").EndAt(favDinoHeight).LimitToLast(2)
results, err := query.GetOrdered(ctx)
if err != nil {
	log.Fatalln("Error querying database:", err)
}
if len(results) == 2 {
	// Data is ordered by increasing height, so we want the first entry.
	// Second entry is stegosarus.
	fmt.Printf("The dinosaur just shorter than the stegosaurus is %s\n", results[0].Key())
} else {
	fmt.Println("The stegosaurus is the shortest dino")
}

Veriler Nasıl Sıralanır?

Bu bölüm, dört sıralama işlevinin her birini kullanırken verilerinizin nasıl sıralandığını açıklar.

siparişByChild

Kullanırken orderByChild() , aşağıdaki gibi belirtilen çocuk anahtar sıralanır içerdiği verileri:

  1. Bir olan çocuklar null belirtilen çocuk anahtarı için değer önce gelir.
  2. Değeriyle Çocuklar false belirtilen çocuk anahtarı için bir sonraki gelir. Birden çocuklar değeri varsa false , bunlar sıralanır sözlük sırasında anahtar ile.
  3. Değerinde olan çocuklar true belirtilen çocuk anahtarı için bir sonraki gelir. Birden çocukların bir değeri varsa true , bunlar anahtar ile leksikografik sıralanır.
  4. Sayısal değeri olan çocuklar, artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse, bunlar anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı değere sahipse, anahtara göre sözlükbilimsel olarak sıralanır.
  6. Nesneler en sonda gelir ve artan düzende anahtara göre sözlükbilimsel olarak sıralanır.

siparişByKey

Kullanırken orderByKey() veri sıralamak için, veri aşağıdaki gibi anahtar ile artan düzende döndürülür. Anahtarların yalnızca dize olabileceğini unutmayın.

  1. 32-bit tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtar olarak dize değerine sahip çocuklar, sözlükbilimsel olarak artan düzende sıralanır.

orderByValue

Kullanırken orderByValue() , çocukların değerinden göre sıralanır. Sipariş kriterleri aynıdır orderByChild() düğümünün değeri yerine belirli bir çocuk anahtarının değeri kullanılır hariç.