迁移Firebase实时数据至Firestore后无法获取指定文档字段问题
问题分析与解决方案
看起来问题出在文档ID不匹配上——你代码里指定的'Atest - 12345'并不是Firestore中实际存储的文档ID,这就导致了exists: false的结果。下面一步步帮你排查和解决:
1. 先确认Firestore中真实的文档ID
既然你能通过批量获取拿到数据,那先修改批量查询的代码,把每个文档的ID打印出来,看看目标文档的真实ID是什么:
var docusRef = db.collection("users").get().then( (data) => { data.forEach( item => { console.log("文档ID:", item.id); // 重点打印这行 let docObj = item.data(); console.log(docObj['Coins']); console.log(docObj['Coins']['Total Coins']); }); });
运行这段代码后,找到对应Coins数据的那一行,看打印出的文档ID是不是和你写的'Atest - 12345'完全一致。
2. 排查ID不匹配的常见原因
- 大小写敏感问题:Firestore的文档ID是大小写敏感的,比如
'Atest - 12345'和'atest - 12345'是两个完全不同的文档。如果实时数据库的key是小写开头,迁移后文档ID也会是小写,这时候你用大写开头的ID去查就会找不到。 - 空格/隐藏字符问题:有时候手动输入的空格可能是全角空格,或者实时数据库的key里包含了看不见的特殊字符(比如换行、制表符),导致你代码里写的ID和实际存储的不一致。直接复制控制台里的文档ID粘贴到代码里,能避免这个问题。
- 迁移代码的潜在问题:你的迁移代码是用实时数据库节点的
item.key作为Firestore文档ID,这个逻辑本身没问题,但要确认实时数据库中该节点的key确实是你预期的'Atest - 12345'。可以在迁移代码里加一行打印验证:
对比这个打印结果和Firestore控制台里的文档ID,看是否一致。ref.once("value", function(snapshot) { let collectionRef = fireastoreDB.collection("users"); snapshot.forEach(item => { console.log("实时数据库节点key:", item.key); // 打印迁移时的key collectionRef.doc(item.key).set(item.val()); }); });
3. 验证修复后的查询
当你拿到真实的文档ID后,替换到查询代码里再测试:
var db = admin.firestore(); // 用复制来的真实文档ID替换下面的字符串 var docusRef = db.collection("users").doc('真实的文档ID') docusRef.get().then(function (col) { if (col.exists) { var name = col.get("Coins"); console.log(name); } else { console.log("文档不存在"); } });
这样应该就能正常获取到数据了。
总结
核心问题就是代码里的文档ID和Firestore中实际存储的不一致,而批量查询能拿到数据是因为它遍历了所有存在的文档,不会受ID拼写错误的影响。手动添加的文档能正常查询,也说明你的Firestore初始化和查询逻辑是没问题的。
内容的提问来源于stack exchange,提问作者pallavi dumpathi
相关产品推荐
相关产品推荐

