gpt4 book ai didi

javascript - 单个 where() 条件导致查询不返回任何内容

转载 作者:行者123 更新时间:2023-12-01 00:42:31 24 4
gpt4 key购买 nike

我正在使用家庭住址从数据库中获取经度和纬度值。

集合中每个文档的结构如下:

"Ext": string
"Lat": string
"Long": string
"Parish": string
"Postal": string
"Street": string
"Number": string

有一些不同的 where() 条件,全部包含在 if 语句中。

街道号码 where() 条件始终导致查询不返回任何匹配项,而所有其他 where() 的查找都正确匹配。

我已经尝试过:

  • 注释掉街道号码 where() 条件
  • 从数据库复制的硬编码值
  • 在 where() 调用中使用 parseInt() 和 toString() 来强制输入
  • 将有关字符串的数据记录到控制台以检查输入、前导/尾随空格等。
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 字符集中的不可见字符(零宽度)。它们会在某些文本编辑器中显示为奇怪的问号符号,但通常根本不显示。

一些further reading .

具体来说,BOM 用于指定 endianness字节字符串,以便可以正确解释它们。

BOM 最终成为数据库编号字段名称中的第一个字符,因为这是 csv 文件中指定的第一列,并且与直觉相反,它不是不匹配的值,而是是字段名称。

有一些迹象表明我缺乏背景来识别:

  • firestore 控制台将“Number”字段放置在按字典顺序排序的字段列表的底部
  • 数字是 Firestore 控制台中唯一用引号括起来的字段名称

解决方案是:

更新集合中的每个条目(因为 csv 列名称成为我的 csv 到 json 转换中的属性名称,然后是我上传时的 firestore 字段名称),

完全删除集合并使用某种查找和替换工具(VS Code 的搜索完成了这项工作)将所有 BOM 替换为空字符串(只需不在 VS Code 搜索中指定替换值并点击“全部替换”即可) “有效)。

如果数据存在零宽度(或其他不需要的)字符的其他问题,则可以使用白名单过滤工具将其过滤掉。理论上,黑名单是可行的,但对于像 unicode 这样大的字符集,它是不实用的,除非您只过滤掉零宽度字符。

感谢所有看过的人!

关于javascript - 单个 where() 条件导致查询不返回任何内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57614742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com