【问题标题】:How do I add a child in one time for each user to under another child firebase?如何一次将每个用户的孩子添加到另一个孩子火力基地下?
【发布时间】:2020-02-04 15:00:17
【问题描述】:

主题标题可能令人困惑。我有studentschild 下的用户。还有mathlabchild。我想要做的是让每个学生的 id 在matlab 孩子下,并在students 孩子下添加一些特定的孩子。

所以如果学生在 mathlab 中创建 "class:"math" , ps:"A" 在 students/id/ 下。

这是火力基地结构。

{
  "mathlab" : {
    "8SFX6ozygaeYm5s80XwEH15eOvR2" : {
      "opos" : "3395762152383824847.5408566913692403"
    },
    "FouXbMWlPpQfkAHSJ98cRyMGyMq2" : {
      "opos" : "2408503147879014222.4051320981527633"
    },
    "pAB5SPbZ42RkpeyB1vSe7vMgh0V2" : {
      "opos" : "4282105147184071736.7786257557636794"
    }
  },
  "students" : {
    "3fw0j4tY1jMuugWaq9N1DZSPNBh2" : {
      "opos" : "4316375953600111482.6297165447082696"
    },
    "8SFX6ozygaeYm5s80XwEH15eOvR2" : {
      "opos" : "3395762152383824847.5408566913692403"
    },
    "FouXbMWlPpQfkAHSJ98cRyMGyMq2" : {
      "opos" : "2408503147879014222.4051320981527633"
    },
    "UCQanT45dlWDb2ntFITa33pC4h22" : {
      "opos" : "5279089148868706990.4495067048309678"
    },
    "aVoyqW6IcsdJEylwT7uuIyYU87l1" : {
      "opos" : "4668496806381405007.7330624192123722"
    },
    "pAB5SPbZ42RkpeyB1vSe7vMgh0V2" : {
      "opos" : "4282105147184071736.7786257557636794"
    },
    "uDQ7ISmmG7RsbCizNXQIZvysEK22" : {
      "opos" : "1342746957828245395.2663129729855386"
    },
    "xM9U9MjoZUVOcqOVG38SzLrzd1z1" : {
      "opos" : "3998977600021296207.4092046127102224"
    }
  }
}

到目前为止我做了什么

我收集学生的每个 id 并推入一个数组。但是如何一次性创建孩子呢?

    var mathkids = [];
var matstudens1;


    myref.child('mathlab').on("value", function(snapshot) {
        snapshot.forEach(function(data) {


           //Get id's

                mathkids.push(data.key);



        });
        console.log(mathkids); 
    });



    }

这是必须的样子。

|students
 |8SFX6ozygaeYm5s80XwEH15eOvR2
  |class:"math"
  |ps:"A"
 |5pw4MkVxKob8nXiHojTl61tQQ822
  |class:"math"
  |ps:"A"
 |FeP6H8H0PyVjMDcqwH3zbY0xAxg2
...
|mathlab
 |8SFX6ozygaeYm5s80XwEH15eOvR2
 |5pw4MkVxKob8nXiHojTl61tQQ822
...

更新

所以我得到了学生 id 并存储到“mathkids”数组。这是我推送数据时的操作。

secondref = firebaseRef = firebase.database().ref().child("students").child(matstudens1);
secondref.on('value' ,function(datasnapshot) {





    secondref.child("class").set("math");
    secondref.child("ps").set("A");





});



}

每次我必须单击按钮更改“matstudens1”值。我如何立即为所有“数学孩子”使用签名?

【问题讨论】:

  • But how do I create the childs in one time 是什么意思?
  • 我得到一个数组并推送。然后我为每个用户一个一个地前进。示例:workfonk = firebaseRef = firebase.database().ref().child("studends").child (数学[0]);比 [1],[2].... 我需要一次性为所有用户做。
  • 很难理解你想要完成什么。我认为这部分是因为您共享的数据结构没有涵盖您想要的输出。您可以编辑您的问题(下面有一个链接),以包含数据库中的实际 JSON(作为文本,不需要屏幕截图)?您可以通过单击Firebase Database console 上溢出菜单 (⠇) 中的“导出 JSON”链接来获取此信息。
  • 谢谢。我编辑了我的帖子。其中一些学生在 mathlab 中,我想在学生孩子下为他们每个人添加一些额外的孩子。
  • 我也不清楚您要达到的目标,但我会说您正在复制大部分数据。我认为您需要重新考虑您的数据库的结构,也许可以阅读数据库设计,否则您将向 Google 支付很多您不需要的钱。

标签: javascript firebase firebase-realtime-database


【解决方案1】:

我不得不说我仍然不太确定你想要实现什么。但是,我认为您正在尝试执行一次性事务或原子更新,以在一次调用中添加/更新您的数据库。然后,如果出现问题,整个事务就会失败,否则一切都会成功……以维护数据库的完整性。

所以,假设我是对的,这里有一个 node.js 云函数(由其他函数调用,因此不会自行导出),我用它来从我的 Firebase RTDB 中删除记录或节点。关键是它是一个“原子更新”,所以要么全部工作要么全部失败……保持数据完整性。在我使用“null”删除记录的情况下,您可以使用“math”、“A”等向相应的子项添加或更新记录。您只需为这些孩子设置正确的参考。然后单个语句await databaseRoot.update(atomicUpdate); 执行整个事务。虽然它是“更新”,但会创建任何不存在的记录。您应该能够从代码 sn-p 看到它是如何工作的,即使它不是特定于您的数据库的。然后,您需要确定如何从阵列中填充 atomicUpdate。 希望我猜对了你的目的,这会有所帮助。 :-)

async function deleteChatThreadStructure(authenticatedUserId, participantId) {
  var databaseRoot = db.ref();
  var chatThreadId = setChatThreadId(authenticatedUserId, participantId);
  var chatsNodeKey = "/chats/" + chatThreadId;
  var chatsParticipantsNodeAuthUserKey = "/chatsParticipants/" + authenticatedUserId + "/" + participantId;
  var atomicUpdate = {
    [chatsNodeKey]: null,
    [chatsParticipantsNodeAuthUserKey]: null,
  };
  try {
    await databaseRoot.update(atomicUpdate);
    console.info("Chat Thread Structure: " + chatThreadId + " deleted!");
  }
  catch (error) {
    console.error("Remove Chat Thread Structure " + chatThreadId +
      " failed with " + error.message);
  }
}

更新: 当我查看您的“它必须是什么样子”时,“mathlab”下的列表只是没有值或子级的键。您不能在需要键值对的 Firebase 中执行此操作。因此,您可以将这些键中的每一个存储为对应的“true”值,以使它们成为 k/v 对,然后可以单独搜索/访问它们,或者我认为您可以将数组存储为键“mathlab”的值。不过我自己没有试过。

进一步更新: 我决定试一试。以下代码生成了这个 db 结构。您需要选择您喜欢的以及您希望如何处理更新和删除。

 const List<String> students = [
   "Student 1",
   "Student 2",
   "Student 3",
   "Student 4",
   "Student 5",
   "Student 6",
   "Student 7",
   "Student 8",
 ];

 _atomicUpdate.addAll(
   {
     "/root/mathLabV1": students,
     "/root/mathLabV2/${students[0]}": true,
     "/root/mathLabV2/${students[1]}": true,
     "/root/mathLabV2/${students[2]}": true,
     "/root/mathLabV2/${students[3]}": true,
     "/root/mathLabV2/${students[4]}": true,
     "/root/mathLabV2/${students[5]}": true,
     "/root/mathLabV2/${students[6]}": true,
   },
 );
 // Add to database.
 // This is a batched (atomic) update that either succeeds or all fails
 // both database additions as one transaction.
 // .update will add records when they don't exist (or replace them if they do).
 await _referenceRoot.update(_atomicUpdate);

请在下方评论后更新 要检查学生 id 是否存在于“mathLabV2”下,我将在 Flutter/Dart 中使用以下代码......您需要修改其语法以满足您的需求,但概念是相同的:

_referenceRoot.child("root").child("mathLabV2").child(<your_student_id>).once()
.then((DataSnapshot snapshot) {
    if (snapshot.value != null) {
      <Do your update processing on the 'students' node using <your_student_id>>;
    }
  },
),

【讨论】:

  • 感谢您的努力。通常我不需要自动更新。这是一个单一的时间功能。我不确定我是否应该使用云功能。我将使用您的代码将孩子设置为 true。然后我使用 .equalTo("true") 方法来获取相关用户并创建孩子我想要什么。我做对了吗?
猜你喜欢
  • 2018-01-14
  • 2016-11-30
  • 1970-01-01
  • 2017-10-19
  • 2013-09-15
  • 1970-01-01
  • 2018-05-22
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多