【发布时间】:2020-02-09 13:44:53
【问题描述】:
我想像这样查询 firebase,但它不允许我这样做。有没有办法动态查询firebase?我需要处理非常具体的情况——例如,如果用户选择“无关紧要”,那么我需要从查询中删除该首选项过滤器,一些字段是数组数据类型,一些是字符串,一些是数字。我需要能够处理所有形式的数据类型并适当地填充 where 子句。手动检查每个字段并调用每个字段将对系统产生负担(有超过 20 个字段可供查询)。任何建议都会很棒!
for(ddp in docDataPreferences){
if(docDataPreferences[ddp] == "Doesn't Matter"){
allDoesntMatterPreferences.push(ddp);
} else if(docDataPreferences[ddp] != "Doesn't Matter" && docDataPreferences[ddp] != '' && docDataPreferences[ddp] != undefined) {
keysWithValues.push(ddp);
whereClause += ".where('preferences."+ ddp + "', 'array-contains-any', " + JSON.stringify(docDataPreferences[ddp]) +")"
}
}
var usersMatchesCollection = config.db.collection("Users");
var query = usersMatchesCollection + whereClause;
await query.get().then( function (matchesQuerySnapshot) {
matchesQuerySnapshot.forEach(function(doc) {
//...do something
})
})
TypeError:query.get 不是函数。 (在 'query.get()'、'query.get' 未定义)]
我可以看到 where 子句打印正确,但我假设您不能连接对象和字符串。当我像这样手动添加返回的 whereClause 时:
var query = usersMatchesCollection.where('preferences.datingPrefDistance', '==', 22).where('preferences.datingPrefDrinking', '==', "No").where('preferences.datingPrefEducation', '==', "Doctorate").where('preferences.datingPrefKids', '==', "No").where('preferences.datingPrefMarried', '==', "No").where('preferences.datingPrefSmokingCig', '==', "No").where('preferences.datingPrefSmokingPot', '==', "No").where('preferences.prefDrinking', '==', "No").where('preferences.prefEducation', '==', "Doctorate").where('preferences.prefIdentifyAs', '==', "Male").where('preferences.prefKids', '==', "No").where('preferences.prefMarried', '==', "No").where('preferences.prefSmokingPot', '==', "No")
它有效。因此,导致问题的是串联。
有解决办法吗?
【问题讨论】:
-
我不确定我是否理解您共享的代码存在什么问题。你能解释一下当你运行这段代码时什么不起作用吗?
-
@FrankvanPuffelen 抱歉,我应该把我遇到的错误放在帖子里。我回来了 "TypeError: query.get is not a function. (In 'query.get()', 'query.get' is undefined)]" 。我也更新了帖子。我认为问题是我无法连接 whereClase 和 usersMatchesCollection。所以我的问题是 - 如果我无法连接,我如何能够进行动态 Firebase 查询?
标签: javascript firebase google-cloud-firestore