Javascript 单个where()条件导致查询不返回任何内容
我使用家庭地址从数据库中获取经度和纬度值 集合中每个文档的结构如下所示:Javascript 单个where()条件导致查询不返回任何内容,javascript,firebase,google-cloud-firestore,byte-order-mark,zero-width-space,Javascript,Firebase,Google Cloud Firestore,Byte Order Mark,Zero Width Space,我使用家庭地址从数据库中获取经度和纬度值 集合中每个文档的结构如下所示: "Ext": string "Lat": string "Long": string "Parish": string "Postal": string "Street": string "Number": string 有几个不同的where()条件,都包含在if语句中 street number where()条件总是导致查询不返回匹配项,而所有其他where()都会正确查找匹配项 我试过: 注释掉街号where(
"Ext": string
"Lat": string
"Long": string
"Parish": string
"Postal": string
"Street": string
"Number": string
有几个不同的where()条件,都包含在if语句中
street number where()条件总是导致查询不返回匹配项,而所有其他where()都会正确查找匹配项
我试过:
- 注释掉街号where()条件
- 从数据库复制的硬编码值
- 在where()调用中使用parseInt()和toString()强制键入
- 将有关字符串的数据记录到控制台,以检查键入、前导/尾随空格等
- 我不是在查询其他集合
- 所有文档都具有相同类型的相同字段
- 我所做的测试似乎不允许查询中存在类型不匹配的可能性
这可能是我的无知,但问题似乎很奇怪。Firebase支持非常有用。这要感谢解决问题的支持代表 谢谢卡洛斯强> 结果证明我的代码是正确的,我的数据有一个非常微妙的问题 我从另一个数据库以csv格式下载了这个数据库中的数据,用Excel验证了内容,并在某个时候保存了它。Excel作为Excel,决定任何好的UTF-8编码csv文件都需要以字节顺序标记开始 对于那些不知道的人(比如我不知道),字节顺序标记是unicode字符集中不可见的字符(零宽度)。在一些文本编辑器中,它们会显示为奇怪的问号符号,但通常根本不会显示 一些 具体而言,BOM用于指定字节字符串的长度,以便正确解释它们 BOM最终成为数据库编号字段名称中的第一个字符,因为这是csv文件中指定的第一列,而且,与直觉相反,不是值不匹配,而是字段名称 有几个迹象表明,我缺乏认识到的背景:
- firestore控制台将“Number”字段放在按字典顺序排序的字段列表底部
- 编号是firestore控制台中唯一用引号括起来的字段名
感谢所有看过的人 Firebase支持非常有用。这要感谢解决问题的支持代表 谢谢卡洛斯强> 结果证明我的代码是正确的,我的数据有一个非常微妙的问题 我从另一个数据库以csv格式下载了这个数据库中的数据,用Excel验证了内容,并在某个时候保存了它。Excel作为Excel,决定任何好的UTF-8编码csv文件都需要以字节顺序标记开始 对于那些不知道的人(比如我不知道),字节顺序标记是unicode字符集中不可见的字符(零宽度)。在一些文本编辑器中,它们会显示为奇怪的问号符号,但通常根本不会显示 一些 具体而言,BOM用于指定字节字符串的长度,以便正确解释它们 BOM最终成为数据库编号字段名称中的第一个字符,因为这是csv文件中指定的第一列,而且,与直觉相反,不是值不匹配,而是字段名称 有几个迹象表明,我缺乏认识到的背景:
- firestore控制台将“Number”字段放在按字典顺序排序的字段列表底部
- 编号是firestore控制台中唯一用引号括起来的字段名
function addressToCoords() {
// returns an array of coordinates if successful, false otherwise
const ADD = document.getElementById("address").value;
let NUM;
let STREET;
if (ADD) {
NUM = ADD.match(/^[0-9]+/)[0];
STREET = ADD.replace(/^[0-9]+\s/, "");
if (NUM === STREET) {
console.log("NUM = STREET. regex split failed");
STREET = null;
return false;
}
}
const CTY = document.getElementById('parish').value;
const POS = document.getElementById('postalCode').value.replace(/\s/, "");
let coords = [0.0, 0.0];
let query = f.addresses;
if (CTY) { console.log("CTY: ", CTY); query = query.where("Parish", "==", CTY); }
if (STREET) { console.log("STREET: ", STREET); query = query.where("Street", "==", STREET); }
if (POS) { console.log("POS: ", POS); query = query.where("Postal", "==", POS); }
// -FIXME- doesn't match
if (NUM) {
// Usual test case outputs:
// NUM: 1 string 1
console.log("NUM: ", NUM, " ", typeof(NUM), " ", NUM.length);
query = query.where("Number", "==", NUM);
}
query.limit(5)
.get()
.then(querySnapshot => {
if (!querySnapshot.empty) {
querySnapshot.docs.forEach (ele => {
console.log("doc found!: ", ele.data());
});
coords[0] = querySnapshot.docs[0].Lat;
coords[1] = querySnapshot.docs[0].Long;
} else {
console.log("no doc found!");
}
}).catch(function(error) {
console.log(error);
});
document.getElementById("Latitude").value = coords[0];
document.getElementById('Longitude').value = coords[1];
return coords;
}