在Firestore中,当我编写查询并像这样执行时,它工作正常
_query = query(collectionTestingRef,
where('name','==', 'him') ,
limit(4));
但是当我在一些变量中进行查询,然后使用(需要,因为我需要运行循环并添加未知的where条件)时,它不起作用。
var _localWherequery = "where('name','==', 'him')" ;
_query = query(collectionTestingRef,
_localWherequery,
limit(4));
我知道我不知道where子句的数量,我想只在Firestore中使用查询游标,我如何实现这个动态。
不能在_localWherequery
变量的字符串中包装where
子句条件。因为Firestore将无法将其解释为查询过滤器。
相反,你可以创建一个函数,它接受where子句的列表,并动态地构建一个Firestore查询。
这只是一个你可以随意修改的例子:
import { collection, getDocs, limit, query, where } from "firebase/firestore";
import { db } from "./config/firebase.js";
const ref = collection(db, "users");
const whereClause = where("name", "==", "him");
const queryLimits = limit(2);
const q = query(ref, whereClause, queryLimits);
const snaps = await getDocs(q);
snaps.docs.forEach(doc => console.log(doc.id, " --> ", doc.data()));
虽然您也可以使用一些不同的方法来创建自定义查询,但下面将介绍其中一个方法。让注意这样做将失去所有的推理,因为方法参数将变成any
类型:
import { collection, getDocs, query, where } from "firebase/firestore";
import { db } from "./config/firebase.js";
function buildQuery(collectionRef, whereClauses) {
let q = query(
collectionRef,
...whereClauses.map((clause) =>
where(clause.field, clause.operator, clause.value)
)
);
return q;
}
const ref = collection(db, "users");
const whereClauses = [
{ field: "name", operator: "==", value: "him" },
{ field: "age", operator: ">=", value: 18 },
{ field: "gender", operator: "==", value: "male" },
];
const q = buildQuery(ref, whereClauses);
const snaps = await getDocs(q);
snaps.docs.forEach((doc) => console.log(doc.id, " --> ", doc.data()));
参考:在Cloud Firestore中执行简单和复合查询