我有很多短语与.push()一起添加到firebase对象,如下所示:
phrases: {
"$phrase_key<1>": {
text: "Hello",
language: "eng"
},
"$phrase_key<2>": {
text: "How are you?",
language: "eng"
}
...
}
每个用户都可以按语言翻译每个句子,所以我有:
translations: {
portuguese: {
"$phrase_key": {
"$user_id<1>": "Oi!",
"$user_id<2>": "Olá!",
"$user_id<3>": "Oi!",
},
"$phrase_key<2>": {
"$user_id<1>": "Como vai?",
"$user_id<2>": "Tudo bem?"
}
}
}
我在层次结构中的$ user_id之前使用$ phrase_id,因为在前端,我可以简单地查询当前用户尚未翻译的短语块
var translationsRef =
new Firebase("https://<project>.firebaseio.com/translations/portuguese");
var queryRef = translationsRef
.orderByChild(auth.uid) // Session user id
.startAt(null) // Give me phrases the user haven't translated yet
.limitToFirst(10); // 10 of them, please
这是正常的,除了它是 very slow ,这是可以理解的,因为有成千上万的翻译短语,并且查询没有索引 . 每个查询需要20-30秒才能开始递交结果 .
我曾想过在我当前的实现上使用.indexOn,但是它不能索引每个用户id,这是不可能的..
我虽然使用复合键进行翻译($ user_id "_" $ phrase_id)和索引,但这只能解决用户已翻译的短语问题 . 我'd have to add a ' null'缺少翻译,(numberOfUsers * numberOfPhrases)次..
让我知道你们是否可以找到解决方案,或者我是否应该继续进行弹性搜索 .
提前致谢!
加藤问题的答案
- 不存在_Entries?您没有在查询中使用.child($ phrase_key),因此orderByChild(auth.uid)永远不会匹配.
是的,尚未翻译的短语不会显示在查询中(它们不是对象中的键) . 如果他们已被任何人(会话中的用户除外)翻译,他们将返回 . 我想过使用第一个翻译作为确定句子可以发送给其他翻译者的方法 .
- 您在查询中没有使用.child($ phrase_key),因此orderByChild(auth.uid)永远不会匹配.
我想知道的是什么 . 这就像docs example中的$ dinossaur_species键 . 我没有把查询本身的参数本身分开,就像在文档中一样,这让我更加困惑 . 对于那个很抱歉 .
- 另外,你想要equalTo(null)吗? startAt(null)将返回所有内容,无论它是否为null?
是的,你是对的 . 改变这一点 .
1 回答
我想我一直试图用一片比萨饼钉一个钉子(比萨饼没什么问题!) . Firebase令人惊叹,但真的不适合这个 .
即使我解决了性能问题,firebase仍然存在两个无法解决的问题
在理想情况下,我想将我发送给翻译者的短语随机化 .
我正在回复对该短语所做的每一次翻译(当然,它是对象结构的一部分),当我需要的只是短语的关键时 .
如果您不必在前端执行此操作,这是一项非常简单的任务(即使是弹性搜索也是过度杀伤),我通过简单地使用我已经做过其他事情的Web应用程序解决了这个问题 . 我保留一个数组,其中包含短语键和一个在内存中翻译的对象(对于每种语言),都与firebase同步 . 当服务器获得具有语言和用户ID的请求时,它会减去用户完成的翻译,获得10个随机项,就是这样 .
再一次,一旦我解释了这个问题,答案就会跳到我面前..经常发生..