私はまだFirebaseにいますが、今回はオブジェクトの削除に関する質問があります。オブジェクトを削除するときにネストされたフィールドにあるインデックスを削除する
私は、次のような構造を有する:私は私が持っているユーザーを削除したい場合は
のでusers: {
UsErId1:{
name: "Jack",
email: "[email protected]"
},
UsErId2: { + },
UsErId3: { + }
},
user_contacts: {
UsErId1:{
UsErId2: true,
UsErId3: true
},
UsErId2: {
UsErId1: true
}
}
を:
- は、ユーザーオブジェクト
- は、下のユーザーオブジェクトを削除しますuser_contactsブランチ
- そのユーザーを指すuser_contactsからすべてのインデックスを削除します。
私のパフォーマンスの問題は、すべてのuser_contactsエントリを反復して、ユーザーが子供にいるかどうかを確認する必要があるため、ポイント3から発生します。
コードの例は以下の通りである。
私は2つの解決策を考えてきましたprivate void deleteUser(String userId) {
firebaseDatabase.getReference("users").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").child(userId).removeValue();
firebaseDatabase.getReference("users_contacts").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot usersSnapshot : dataSnapshot.getChildren()) {
for(DataSnapshot contactSnapshot : usersSnapshot.getChildren()){
String contactId = contactSnapshot.getValue(String.class);
if(contactId.equals(userId)){
contactSnapshot.getRef().removeValue();
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
:
ソリューション1:
user_contacts
、いつからインデックスを削除しないでくださいユーザーの連絡先を読み込む必要があります。ユーザーがnull(削除されている)かどうかを確認するために各ユーザーへの呼び出しを行いました。その場合は表示しないでください。ところで、この結果、データベースが汚れてしまいます。ソリューション2:私は削除しようとしているユーザーが参照されているユーザーを格納逆インデックス
contacts_users
を作成します。次のように:contacts_user: { UsErId1: { UsErId2: true }, UsErId2: { UsErId1: true }, UsErId3: { UsErId1: true } }
ので
、私はユーザーを削除しなければならないとき、私はcontacts_users
にそのチャイルズを見て、その連絡先にそれを持っているすべてのユーザーを知っているし、今では(それを削除に進みます私は全体のパスを知ることができます)。これは、NoSqlのようなアプローチであるように思えます。
あなたはどう思いますか?それを行う別の方法がありますか?
同じです:ループフィルタリングが必要なときはいつでも、リバースインデックスを作成する方がよいでしょう。 –