Quasar Firestore 字段相等查询过滤器不起作用
Quasar Firestore field equality query filter doesn't work
我正在使用 quasar read/write 向 Cloud Firestore 发送唯一数据,但以下代码不起作用。它无法根据 title
字段检测现有记录。我正在使用 Web 版本 9 语法。
<script>
import seedData from "../../data/todos.json";
import {
getFirestore,
collection,
getDocs,
addDoc,
query,
where,
} from "firebase/firestore";
const db = getFirestore();
seedData.forEach(async (todo) => {
console.log("Processing ", todo.title, "...");
const q = query(
collection(db, "todos"),
where("title", "==", todo.title)
);
const querySnapshot = await getDocs(q);
if (querySnapshot.empty) {
console.log("Add missing todo: ", todo.title);
await addDoc(collection(db, "todos"), { todo });
this.todos.push(todo);
} else {
console.log("Skip existing record: ", querySnapshot.docs[0].data());
}
});
</script>
示例数据:
[{
"userId": 1,
"id": 1,
"title": "Learn Quasar",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "Learn Vue",
"completed": false
},
{
"userId": 1,
"id": 3,
"title": "Learn Firebase",
"completed": false
}
]
欢迎任何建议和见解。
在 quasar dev
调试会话中在浏览器中看到的重复数据:
在 Firestore 控制台中看到重复数据:
我无法用这个简化的代码重现问题:
const q = query(
collection(db, "69534155"),
where("title", "==", "Learn Quasar")
);
const querySnapshot = await getDocs(q);
if (querySnapshot.empty) {
console.log("Add missing todo: ", "Learn Quasar");
} else {
console.log("Skip existing record: ", querySnapshot.docs[0].data());
}
有关完整的工作代码,请参阅:https://jsbin.com/gekuqec/3/edit?html,console
这会打印:
Skip existing record: ...
当我将标题更改为 non-existing 时,它会打印:
Add missing todo:
我建议在调试器中单步执行代码,并检查 todo.title
是否真的具有文档中存在的值。
如果在此之后您仍然遇到问题,请尝试使用我在此处分享的类似最小设置重现它,以便我们查看。
请记住包含用于过滤器 <object>.<field>
的字段的完整路径。在这种情况下,它是 todo.title
。所以,where("todo.title", "==", todo.title)
解决了这个问题。
我正在使用 quasar read/write 向 Cloud Firestore 发送唯一数据,但以下代码不起作用。它无法根据 title
字段检测现有记录。我正在使用 Web 版本 9 语法。
<script>
import seedData from "../../data/todos.json";
import {
getFirestore,
collection,
getDocs,
addDoc,
query,
where,
} from "firebase/firestore";
const db = getFirestore();
seedData.forEach(async (todo) => {
console.log("Processing ", todo.title, "...");
const q = query(
collection(db, "todos"),
where("title", "==", todo.title)
);
const querySnapshot = await getDocs(q);
if (querySnapshot.empty) {
console.log("Add missing todo: ", todo.title);
await addDoc(collection(db, "todos"), { todo });
this.todos.push(todo);
} else {
console.log("Skip existing record: ", querySnapshot.docs[0].data());
}
});
</script>
示例数据:
[{
"userId": 1,
"id": 1,
"title": "Learn Quasar",
"completed": false
},
{
"userId": 1,
"id": 2,
"title": "Learn Vue",
"completed": false
},
{
"userId": 1,
"id": 3,
"title": "Learn Firebase",
"completed": false
}
]
欢迎任何建议和见解。
在 quasar dev
调试会话中在浏览器中看到的重复数据:
在 Firestore 控制台中看到重复数据:
我无法用这个简化的代码重现问题:
const q = query(
collection(db, "69534155"),
where("title", "==", "Learn Quasar")
);
const querySnapshot = await getDocs(q);
if (querySnapshot.empty) {
console.log("Add missing todo: ", "Learn Quasar");
} else {
console.log("Skip existing record: ", querySnapshot.docs[0].data());
}
有关完整的工作代码,请参阅:https://jsbin.com/gekuqec/3/edit?html,console
这会打印:
Skip existing record: ...
当我将标题更改为 non-existing 时,它会打印:
Add missing todo:
我建议在调试器中单步执行代码,并检查 todo.title
是否真的具有文档中存在的值。
如果在此之后您仍然遇到问题,请尝试使用我在此处分享的类似最小设置重现它,以便我们查看。
请记住包含用于过滤器 <object>.<field>
的字段的完整路径。在这种情况下,它是 todo.title
。所以,where("todo.title", "==", todo.title)
解决了这个问题。