Firebaseからデータをフェッチして返すAPI(私のサーバを指している)をユーザに提供したいと思います。私は、それがストリーミングではなく、「通常の」ポイントインタイムリクエストであることを望んでいます。ある時点でリスト内に複数のオブジェクトを取得する方法
私のデータは 'projects'内の 'boxes'です。ユーザーは自分のAPIに問い合わせてプロジェクトのすべてのボックスを取得できます。
私のデータは正規化されているので、プロジェクトを検索し、そのプロジェクトのボックスのキーのリストを取得し、各ボックスレコードを個別に取得します。一度それらをすべて持っていれば、私はユーザーにアレイを返すでしょう。
私の質問:これを行う最善の方法は何ですか?
これは私が持っているものであり、動作します。しかし、それはとてもハッキリです。
const projectId = req.params.projectId; // this is passed in by the user in their call to my server.
const boxes = [];
let totalBoxCount = 0;
let fetchedBoxCount = 0;
const projectBoxesRef = db
.child('data/projects')
.child(projectId)
.child('boxes'); // a list of box keys
function getBox(boxSnapshot) {
totalBoxCount++;
db
.child('data/boxes') // a list of box objects
.child(boxSnapshot.key())
.once('value')
.then(boxSnapshot => {
boxes.push(boxSnapshot.val());
fetchedBoxCount++;
if (fetchedBoxCount === totalBoxCount) {
res.json(boxes); // leap of faith that getBox() has been called for all boxes
}
});
}
projectBoxesRef.on('child_added', getBox);
// 'value' fires after all initial 'child_added' things are done
projectBoxesRef.once('value',() => {
projectBoxesRef.off('child_added', getBox);
});
はchild_added
オブジェクトの初期セットを分離する上でいくつかの他の質問/回答はありますが、彼らは私の現在の意思決定に影響を与えたが、彼らは直接関連していないようです。
ありがとうございました。
アップデート:以下ジェイの答えのJavaScriptバージョン:
db
.child('data/boxes')
.orderByChild(`projects/${projectId}`)
.equalTo(true)
.once('value', boxSnapshot => {
const result = // some parsing of response
res.json(result);
});
いいですね。でも、「1(深い)クエリ」はどのように見えますか? –
@DavidGilbertsonディープクエリー[ディープクエリー](https://www.firebase.com/blog/2015-09-24-atomic-writes-and-more.html)について説明しているfirebaseウェブサイトの素晴らしいブログ記事があります。また、ここでは例のスタックオーバーフローについても検索します。あなたのプラットフォームが何であるか分かりませんし、ウェブサイト上の例も異なっています。私はMacOS SwiftやObj-Cを使っています。あなたがブログの投稿を見直した後に、あなたが何かを必要とするかどうかを教えてください。そのために – Jay
ありがとうございます。私はちょうどその投稿と他の '深いクエリ'の質問を読んだが、私はまだこれを行うために深いクエリを使用する方法を見ることができません(ボックスには、彼らが属するプロジェクトへの参照はありませんそれはあなたが何を考えていたのか?)。私はJavaScript SDKを使用しています。 –