查询每个条目的ID,包括指定的子键

时间:2017-07-06 21:17:29

标签: javascript firebase firebase-realtime-database

给出如下的数据库方案:

{
   "lessons": {
      "subjectId1": {
           "lessonId2": { ... },
           "lessonId4": { ... },
           "lessonId6": { ... }
      },
      "subjectId2": {
           "lessonId1": { ... },
           "lessonId3": { ... },
           "lessonId5": { ... },
           "lessonId7": { ... }
      }
   }
}

如何检索包含给定lessonId的任何主题的ID?

我提出了这样的功能:

    const refWithParent = database.ref("lessons");
    const snapshot = await refWithParent.orderByChild(lessonId).limitToLast(1).once("value");

    let firebaseId = null;
    if (snapshot.val() !== null) {
        snapshot.forEach(entry => {
            firebaseId = entry.key;
            return true;
        });
    }
    return firebaseId;

这确实有效但我无法在动态创建子项时在数据库中创建索引。 有没有更简单的方法来检索id?

2 个答案:

答案 0 :(得分:1)

据我了解,您想要检索包含具有特定ID的课程的任何主题的一个索引。如果是这样,你可以添加一个节点"包含"对于您将把表格的键/值放入其中的每个主题:lessonId: true

{
   "lessons":{
      "subjectId1":{
         "contains":{
            "lessonId2":true,
            "lessonId4":true,
            "lessonId6":true
         },
         "lessonId2":{ ... },
         "lessonId4":{ ... },
         "lessonId6":{ ... }
      },
      "subjectId2":{
         "contains":{
            "lessonId1":true,
            "lessonId3":true,
            "lessonId5":true,
            "lessonId7":true
         },
         "lessonId1":{ ... },
         "lessonId3":{ ... },
         "lessonId5":{ ... },
         "lessonId7":{ ... }
      }
   }
}

然后进行查询(假设 lessonID 是代码中的变量):

refWithParent.orderByChild(`contains/${lessonID)`).equalTo(true).limitToFirst(1).once('value');

然后按如下方式检查获取的snaphost:

if (snapshot.val() !== null)
{
   let subjectId = snapshot.key;
   //TODO something with subjectId...
}

注意,您必须始终将相应的对添加到"包含"向主题添加课程时的节点。与删除相同。

P.S。如果您想获取包含给定课程的所有科目的ID,只需从查询中删除.limitToFirst(1)即可。这就是全部。

答案 1 :(得分:0)

在像firebase这样的Nosql中,您可以根据需要对数据库进行非规范化或格式化。我建议您在创建课程时将所有课程名称连接起来,以避免查询数据库。 下面的代码可以帮助您在创建主题名称时使用主题名称的连接来获取唯一的课程ID。

 let newId = database.ref("lessons").ref.push().key; //<-- get a new unique id
 let newlessonname = 'Subject2_' + newId;

所以你的数据库看起来像这样

{
   "lessons": {
      "subjectId1": {
           "subjectId1_lessonId2": { ... },
           "subjectId1_lessonId4": { ... },
           "subjectId1_lessonId6": { ... }
      },
      "subjectId2": {
           "subjectId2_lessonId1": { ... },
           "subjectId2_lessonId3": { ... },
           "subjectId2_lessonId5": { ... },
           "subjectId2_lessonId7": { ... }
      }
   }
}
  

可选地

您可以将Subjectid包含在每个课程的对象中,如下所示

{
   "lessons": {
      "subjectId1": {
           "lessonId2": {subjectid:"subjectId1" ... },
           "lessonId4": { ... },
           "lessonId6": { ... }
      },
      "subjectId2": {
           "lessonId1": { ... },
           "lessonId3": { ... },
           "lessonId5": { ... },
           "lessonId7": { ... }
      }
   }
}