Firebase: consulta para excluir datos según una condición

Puedo obtener los datos para un valor particular en el niño usando orderByChild e equalTo (que funciona bien para niños nesteds)

 private void getData() { try { final DatabaseReference database = FirebaseDatabase.getInstance().getReference(); database.child(Constants.TABLE_TASKS).orderByChild("user/id") .equalTo("somevalue") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { Timber.d(dataSnapshot.toString()); } @Override public void onCancelled(DatabaseError databaseError) { } }); } catch (Exception ex) { ex.printStackTrace(); } } 

¿Hay una manera fácil de obtener los datos donde no se encuentra un valor particular, básicamente algo así como un valor no notEqualTo("somevalue") ?

En el modelo de consulta de Firebase, no puede filtrar la desigualdad a un valor .

Pero puede probar la ausencia de cualquier valor (esencialmente: la ausencia de una propiedad). Por ejemplo, con este modelo de datos:

 { child1: { "user": { "id": 1, "name": "puf" } }, child2: { "user": { "id": 2, "name": "abe" } }, child3: { "user": { "id": 3 } } } 

Puedo buscar niños sin una propiedad de user/name con:

 ref.orderByChild('child/name').equalTo(null) 

Lo que conduce al único hijo que no tiene un nombre:

child3

Siéntete libre de jugar con mi jsbin para ver si llegas más lejos: http://jsbin.com/liyibo/edit?js,console

Actualización: sabía que ya había respondido esto antes, pero no pude encontrarlo antes. Aquí está el engañado: ¿ es posible que los datos de consulta no sean iguales a la condición especificada? . Parece que tengo un error allí, ya que claramente estoy probando la ausencia de una propiedad en el código anterior.

Creo que encontré la solución y esto es más acerca de cómo debería diseñarse la base de datos y, de hecho, ahora comprendo la intención detrás de la directriz de Firebase

https://firebase.google.com/docs/database/android/structure-data

Diseño original:

 { child1: { "user": { "id": "id1", "name": "puf" } }, child2: { "user": { "id": "id2", "name": "abe" } }, child3: { "user": { "id": "id1" "name": "puf" } } } 

Diseño actualizado:

Por lo tanto, aparte de almacenar el id y el nombre del usuario, también deberíamos almacenar un nodo con el id como la clave y marcarlo como verdadero

 { child1: { "user": { "id": "id1", "name": "puf" "id1": true } }, child2: { "user": { "id": "id2", "name": "abe" "id2": true } }, child3: { "user": { "id": "id1" "name": "puf" "id1": true } } } 

Con el diseño actualizado, si ejecuto ref.orderByChild('user/id1').equalTo(true)

Me gustaría obtener salida como Child1 y Child 3

y si ejecuto ref.orderByChild('user/id1').equalTo(null) ,

Me gustaría obtener Child2 como salida