Problema de consulta en Firestore con filtro OR y combinación FieldPath.documentId
Con solo un documento (myUid) en userCollection, ejecuté la siguiente función para recuperar documentos distintos de myUid.
static Future<String?> getUnmatchedUser(String? myUid) async{
print('getUnmatchedUser: myUid == $myUid');
try {
QuerySnapshot querySnapshot = await _userCollection
.where(FieldPath.documentId, isNotEqualTo: myUid)
.where(Filter.or(
Filter("queried_language", isEqualTo: 'en'),
Filter("queried_language", isEqualTo: 'ja')))
.get();
print('querySnapshot.docs.length == ${querySnapshot.docs.length}');
return null;
} catch (e) {
print('getUnmatchedUser: ERROR == $e');
return null;
}
}
En la función anterior, se espera que la cantidad de documentos recuperados sea 0. Sin embargo, aunque un documento coincida con myUid se excluye, se recupera y la cantidad de documentos recuperados es 1.
A continuación se muestran las capturas de pantalla de la consola de Firestore y la consola de VScode en ese momento.
Por otro lado, si la función se ejecuta excluyendo la línea usando el filtro donde con OR como se muestra a continuación, el documento no se recupera. Este es el comportamiento esperado.
QuerySnapshot querySnapshot = await _userCollection
.where(FieldPath.documentId, isNotEqualTo: myUid)
.get();
¿Cuál es la razón por la que se recupera un documento que coincide con myUid en la función anterior? Por favor dime cual es el problema, te lo agradecería.
Igual que en tu pregunta anterior, estás utilizando el operador incorrecto aquí. Si desea probar si un campo de un solo valor tiene uno de varios valores, utilice el whereIn
operador .
.where("queried_language", whereIn: ['en', 'ja']),
En esta etapa, le recomiendo que se tome un tiempo para leer la documentación de Firebase sobre consultas de Firestore de principio a fin antes de continuar. Dedicar tiempo a eso ahora ahorrará mucho más tiempo (y preguntas) en el futuro.