单个 where() 条件导致查询不 return 任何东西
Single where() condition causes query not to return anything
我正在使用家庭住址从数据库中获取经度和纬度值。
集合中每个文档的结构如下:
"Ext": string
"Lat": string
"Long": string
"Parish": string
"Postal": string
"Street": string
"Number": string
有一些不同的 where() 条件,都包含在 if 语句中。
街道号码 where() 条件总是导致查询 return 没有匹配,而所有其他 where() 的查找都正确匹配。
我试过:
- 注释掉街道号码 where() 条件
- 从数据库复制的硬编码值
- 在 where() 调用中使用 parseInt() 和 toString() 来强制输入
- 将有关字符串的数据记录到控制台以检查键入、leading/trailing 空格等
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;
}
如有任何见解,我们将不胜感激。
编辑:我目前也在使用 firebase 支持来回切换,显然我的代码成功查询了代表构建并正常运行的示例数据库。
这似乎给数据库结构留下了某种问题,但是...
- 我不是在查询其他集合
- 所有文档都具有相同类型的相同字段
- 我所做的测试似乎不允许查询中出现类型不匹配的可能性
这可能是我的无知,但问题似乎很奇怪。
Firebase 支持非常有用。这个答案要归功于支持代表的解答。
谢谢卡洛斯!
事实证明我的代码是正确的,我的数据有一个非常微妙的问题。
我以csv格式从另一个数据库下载了这个数据库中的数据,用Excel验证了内容,并在某个时候保存了它。 Excel,Excel,决定任何好的 UTF-8 编码的 csv 文件都需要 以字节顺序标记 .
开头
对于那些不知道(比如我不知道)的人,字节顺序标记是 unicode 字符集中的不可见字符(零宽度)。它们会在某些文本编辑器中显示为奇怪的问号符号,但通常根本不会显示。
具体来说,BOM 用于指定字节串的 endianness,以便可以正确解释它们。
BOM 最终成为数据库名称 Number 字段中的第一个字符,因为那是 csv 文件中指定的第一列,而且与直觉相反,这并不是不匹配的值,这是字段名称。
有几个迹象表明我缺乏认识的背景:
- firestore 控制台将 "Number" 字段置于按字典顺序排序的字段列表的底部
- Number 是 firestore 控制台中唯一用引号括起来的字段名称
解决方案是:
更新集合中的每个条目(因为 csv 列名称在我的 csv 中变成 属性 名称到 json 转换,然后是我上传时的 firestore 字段名称),
或
完全删除集合并使用某种查找和替换工具(VS Code 的搜索完成了这项工作)将所有 BOM 替换为空字符串(只是不在 VS Code 搜索中指定替换值并点击 "replace all" 工作)。
如果数据在零宽度(或其他不需要的)字符方面存在一些其他问题,则可以使用白名单过滤工具将其过滤掉。黑名单在理论上是可行的,但是对于像 unicode 一样大的字符集,除非您只过滤掉零宽度字符,否则它是不切实际的。
感谢所有看过的人!
我正在使用家庭住址从数据库中获取经度和纬度值。
集合中每个文档的结构如下:
"Ext": string
"Lat": string
"Long": string
"Parish": string
"Postal": string
"Street": string
"Number": string
有一些不同的 where() 条件,都包含在 if 语句中。
街道号码 where() 条件总是导致查询 return 没有匹配,而所有其他 where() 的查找都正确匹配。
我试过:
- 注释掉街道号码 where() 条件
- 从数据库复制的硬编码值
- 在 where() 调用中使用 parseInt() 和 toString() 来强制输入
- 将有关字符串的数据记录到控制台以检查键入、leading/trailing 空格等
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;
}
如有任何见解,我们将不胜感激。
编辑:我目前也在使用 firebase 支持来回切换,显然我的代码成功查询了代表构建并正常运行的示例数据库。
这似乎给数据库结构留下了某种问题,但是...
- 我不是在查询其他集合
- 所有文档都具有相同类型的相同字段
- 我所做的测试似乎不允许查询中出现类型不匹配的可能性
这可能是我的无知,但问题似乎很奇怪。
Firebase 支持非常有用。这个答案要归功于支持代表的解答。
谢谢卡洛斯!
事实证明我的代码是正确的,我的数据有一个非常微妙的问题。
我以csv格式从另一个数据库下载了这个数据库中的数据,用Excel验证了内容,并在某个时候保存了它。 Excel,Excel,决定任何好的 UTF-8 编码的 csv 文件都需要 以字节顺序标记 .
开头对于那些不知道(比如我不知道)的人,字节顺序标记是 unicode 字符集中的不可见字符(零宽度)。它们会在某些文本编辑器中显示为奇怪的问号符号,但通常根本不会显示。
具体来说,BOM 用于指定字节串的 endianness,以便可以正确解释它们。
BOM 最终成为数据库名称 Number 字段中的第一个字符,因为那是 csv 文件中指定的第一列,而且与直觉相反,这并不是不匹配的值,这是字段名称。
有几个迹象表明我缺乏认识的背景:
- firestore 控制台将 "Number" 字段置于按字典顺序排序的字段列表的底部
- Number 是 firestore 控制台中唯一用引号括起来的字段名称
解决方案是:
更新集合中的每个条目(因为 csv 列名称在我的 csv 中变成 属性 名称到 json 转换,然后是我上传时的 firestore 字段名称),
或
完全删除集合并使用某种查找和替换工具(VS Code 的搜索完成了这项工作)将所有 BOM 替换为空字符串(只是不在 VS Code 搜索中指定替换值并点击 "replace all" 工作)。
如果数据在零宽度(或其他不需要的)字符方面存在一些其他问题,则可以使用白名单过滤工具将其过滤掉。黑名单在理论上是可行的,但是对于像 unicode 一样大的字符集,除非您只过滤掉零宽度字符,否则它是不切实际的。
感谢所有看过的人!