首页 文章

Firebase查询多对多关系中缺少的项目

提问于
浏览
0

我有很多短语与.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 回答

  • 0

    我想我一直试图用一片比萨饼钉一个钉子(比萨饼没什么问题!) . Firebase令人惊叹,但真的不适合这个 .

    即使我解决了性能问题,firebase仍然存在两个无法解决的问题

    • 在理想情况下,我想将我发送给翻译者的短语随机化 .

    • 我正在回复对该短语所做的每一次翻译(当然,它是对象结构的一部分),当我需要的只是短语的关键时 .

    如果您不必在前端执行此操作,这是一项非常简单的任务(即使是弹性搜索也是过度杀伤),我通过简单地使用我已经做过其他事情的Web应用程序解决了这个问题 . 我保留一个数组,其中包含短语键和一个在内存中翻译的对象(对于每种语言),都与firebase同步 . 当服务器获得具有语言和用户ID的请求时,它会减去用户完成的翻译,获得10个随机项,就是这样 .

    再一次,一旦我解释了这个问题,答案就会跳到我面前..经常发生..

相关问题