Problema de consulta en Firestore con filtro OR y combinación FieldPath.documentId

Resuelto mozuku asked hace 54 años • 1 respuestas

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. ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

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.

mozuku avatar Jan 01 '70 08:01 mozuku
Aceptado

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 whereInoperador .

.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.

Frank van Puffelen avatar Feb 15 '2024 16:02 Frank van Puffelen