3

HTTPリクエスト(特定の値を持つすべての子を削除する)でトリガーするクラウド関数を作成しようとしています。 。Firebirdクラウド関数を使用してDataSnapshot内の特定の値を検索する方法

データベースノードは、次のようになります。

activities 
    4GI1QXUJG0MeQ8Bq19WOdCQFo9r1 //uid 
     activity: "hammer" 
     id: some ID 
     note: "some note" 
     timestamp: some timeintervalsince1970 
    7IDUiufhiws8939hdfIUHiuhwdi5 
     etc.... 

私はすべての活動を通して見てみたい、と活性値が「ハンマー」であれば、私は子供を削除したいです。

これは印刷し、私がこれまで持っているもの

​​

です:私の問題は、私はどのようにDataSnapshotを順番に知っていて、持っているすべてのお子様のために見ていないです

{ 
    '4GI1QXUJG0MeQ8Bq19WOdCQFo9r1': 
     { activity: 'nn', 
     id: '4GI1QXUJG0MeQ8Bq19WOdCQFo9r1', 
     note: 'Blank note...', 
     timestamp: 1498032472 }, 
    M6xQU5XWTEVbSqBnR3HBAEhA9hI3: 
     { activity: 'hammer', 
     id: 'M6xQU5XWTEVbSqBnR3HBAEhA9hI3', 
     note: 'some note here...', 
     timestamp: 1497973839 }, 
} 

アクティビティ: "ハンマー"値。 配列を使ってxcodeプロジェクトで同様の機能を実行しましたが、JavaScriptを使用してそれを行う方法がわかりません。

ご協力いただきましてありがとうございます。

+1

Iあなたが望むもの(activity = "hammer")と一致するすべてのレコードに対して、子の値でクエリを実行し、そのIDを使用してそれらを削除するように思えます。セット全体を照会するのは無駄に見えます。 admin SDKのjavascriptドキュメントを使用して、iOSで通常と同じようなクエリを学習します。 –

+0

@DougStevensonああ、私は物事のサーバーサイドを初めて知っているので、私はアプリでやったのと同じアプローチで試していました。どうもありがとう! Btwどこにこのようなことを読み始めるべき場所がありますか? – Elhoej

答えて

3

を役に立てば幸い:

exports.deleteHammerNotifications = functions.https.onRequest((req, res) => { 
    admin.database().ref('activities').once('value', (snapshot) => { 
     snapshot.forEach((childSnapshot) => { 
     console.log(childSnapshot.val()) 
     }); 
    }); 
}); 

しかし、あなたはまだ正しいノードを選択するためにここにクエリを逃しています。このような問い合わせがなければ、admin.database().ref('activities').remove()に電話することもできます。

最も効率的にデータベースからアイテムの数を削除し、(私は最近、必要なものから変更された)この機能を使用し、ユーザに戻って単一の応答を書き込むために:

exports.cleanup = functions.https.onRequest((req, res) => { 
    var query = admin.database().ref("activities").orderByChild("activity").equalTo("hammer"); 
    query.once("value").then((snapshot) => { 
    console.log("cleanup: "+snapshot.numChildren()+" activities"); 
    var updates = {}; 
    snapshot.forEach((child) => { 
     updates["activities/"+child.key] = null; 
    }); 
    admin.database().ref().update(updates).then(() => { 
     res.status(200).send(snapshot.numChildren()+" activities deleted"); 
    }).catch((error) => { 
     res.status(500).send(error); 
    }) 
    }); 
}); 

はこちらをご覧ください:

+0

お返事ありがとうございました! – Elhoej

-1

もし可能ならばわかりませんが、 "child_added"リスナーを起動することができれば、HTTPSトリガーが実行されたら、このようにすることができます。

ref.on('child_added', function(snapshot) { 
if (snapshot.child("activity").val() === 'hammer') { 
var value = snapshot.child("activity").val(); 
}) 

私は、人々はまだ私のメーリングリストかに加入しているかどうかを確認するためにまったく同じことをやっている、と彼らはされている場合、彼らはメールを受信します。

snapshot.forEach()を使用して、一致した子ノードをサイクルに:-)

+1

child_addedリスナーがリッスンを停止しないため、これはお勧めできません。特定の時点で使用可能なすべてのデータが送信されたときは、通知されません。予測可能な方法で終了する単一のクエリのみを使用することが重要です。 –

関連する問題