Tengo este código en el que intento obtener un documento de una colección donde el tiempo no es más antiguo que hace media hora. Falla exactamente en el operador de desigualdad.
try { const HALF_HOUR = 0.1 * 6000 * 6000 / 2; const tsToMillis = firebase.firestore.Timestamp.now().toMillis(); const currenttime = new Date(tsToMillis - HALF_HOUR); const myCurrentLoc = location[0]; // my device location const latitude = myCurrentLoc.latitude; const longitude = myCurrentLoc.longitude; const geocollection = GeoFirestore.collection('chats'); const query = await geocollection.limit(1).near({ center: new firebase.firestore.GeoPoint(latitude, longitude), radius: 0.03 }); query.where('details.time', '>=', currenttime).get().then((querySnapshot) => { if (!querySnapshot.empty) { querySnapshot.docs.forEach(documentSnapshot => { if (documentSnapshot.exists) { this.fetchAllMessages(documentSnapshot.id); } }); } }).catch(error => { console.error("Error in fetch_messages", error); }); } catch (e) { console.error("Something happened: ", e); // ERROR IS TRIGGERED HERE }C:\MyProjects\BLEConnect\node_modules\react-native\Libraries\Core\ExceptionsManager.js:180 Ocurrió algo: Error: firebase.firestore().collection().orderBy() Consulta no válida. Parámetro inicial de Query.orderBy(): g.geohash tiene que ser el mismo que el(los) parámetro(s) de Query.where() fieldPath: detalles.tiempo cuando se invoca un operador de desigualdad
Este error ocurrió solo cuando se invocaba el operador de desigualdad pero no el operador de igualdad "==". ¿Porque? Simplemente no lo entiendo.
PD: el campo "tiempo" se agrega cuando se ha creado el geohash, por lo que en la misma consulta:
const tsToMillis = firebase.firestore.Timestamp.now().toMillis(); const currenttime = new Date(tsToMillis); const geocollection = GeoFirestore.collection('chats'); geocollection.add({ name: 'Geofirestore', uid: device_id, coordinates: new firebase.firestore.GeoPoint(latitude, longitude), time: currenttime })De la documentación de Firestore sobre las limitaciones de consulta :
En una consulta compuesta, las comparaciones de rango (
<,<=,>,>=) y no igual (!=,not-in) deben filtrarse en el mismo campo.
La forma en que se implementan los operadores de desigualdad requiere que ordenes en ese campo primero. Para el operador de igualdad, Firestore puede hacer más por sí mismo, por ejemplo, combinar información de múltiples índices en lo que se conoce como zig-zag-merge-join.
Puede hacer algo como esto, preste atención al 'nativo' que extiende las consultas nativas de firestore:
const geocollection = GeoFirestore.collection('myCollection'); const query = geocollection.near({ center: new firebase.firestore.GeoPoint(latitude, longitude), radius: 0.05 }) .native.where("created", ">", thirty_mins_old).orderBy("created", "desc");