Adding and ".indexOn": ".value" into Firebase Rules
I am aware that this may be a bit too late but here is something that may help you. I was looking for the same information as you, and in my case, it helped me.
$usersId
matches any child key. So you have to do something like this.
{
"rules": {
"chat": {
"rooms": {
"users": {
"$usersId": {
".indexOn": ".value"
}
}
}
}
}
My case:
Using an unspecified index. Consider adding ".indexOn": "date"
at messages/-L2bPVX4_fL41H7lhexc
to your security and Firebase Database rules for better performance:
L2bPVX4_fL41H7lhexc == child
in my NoSQL database structure
solution:
"messages": {
"$messagesId": {
".indexOn": "date"
}
}
To index this structure to allow efficient querying, you have to add an index for each user:
{
"rules": {
"chat": {
"rooms": {
".indexOn": ["users/user1", "users/user2"]
}
}
}
}
That won't be maintainable, since you're likely adding users dynamically.
As usual with NoSQL databases, this means you have to expand/adapt your data model to allow the use-case you want. Instead of querying the rooms for their users, keep a list of the rooms for each user (in addition to your current data):
"user_rooms": {
"user1": {
"chat1": true
},
"user2": {
"chat1": true,
"chat2": true
}
"user3": {
"chat2": true
}
Now you can look up the chat rooms for a user without even needing to query.
Also see my answer about this categorization problem in Firebase query if child of child contains a value.