使用javascript在firebase中自动增加一个值

Posted

技术标签:

【中文标题】使用javascript在firebase中自动增加一个值【英文标题】:Auto increment a value in firebase with javascript 【发布时间】:2016-12-28 04:38:36 【问题描述】:

您好,我正在做一些 firebase 项目,我可以通过 javascript 将我的数据保存到 firebase 数据库中。但我无法弄清楚我的数据库的自动递增子值(我的子值是 duyuru,您可以在下面查看详细信息)。我在下面分享我的代码,你能给我提示来解决这个问题吗?

  <script>

      // Initialize Firebase
      var config = 
        apiKey: "sample1",
        authDomain: "sample2",
        databaseURL: "sample3",
        storageBucket: "sample4",
      ;


      firebase.initializeApp(config);
      var database = firebase.database();

     firebase.initializeApp(config);
  var database = firebase.database();

  function writeUserData(userId, name, email, imageUrl) 
  var kategori1 =  document.getElementById("kategori").value;
  var duyuru1 = document.getElementById("duyuru").value;
  var name1 = document.getElementById("name").value;
  var email1 = document.getElementById("email").value;
  var imageUrl1 = document.getElementById("imageUrl").value;





  firebase.database().ref(kategori1 +"/" + duyuru1).set(
    username: name1,
    email: email1,
    profile_picture : imageUrl1
  );


    </script>

出来是这样的


    "duyuru1": 
        "email": "kjfdlkl",
        "profile_picture": "dsfsd",
        "username": "meraha"
    

我想输出类似的数据;


    "duyuru1": 
        "email": "kjfdlkl",
        "profile_picture": "dsfsd",
        "username": "meraha"
    ,

    "duyuru2": 
        "email": "kjfdlkl",
        "profile_picture": "dsfsd",
        "username": "meraha"
    

duyuru(子值)部分应该是自动递增的,这就是我想要的。谢谢你的回答

【问题讨论】:

【参考方案1】:

Firebase 没有自动递增的密钥,因为这些密钥在客户端可能长时间离线的大型多用户系统中无法正常工作。

相反,Firebase 有自己的自动生成密钥类型,称为推送 ID。这些推送 ID 与许多关系数据库中的序列具有相同的重要属性:它们是有序的和连续的。但此外,它们可以在客户端计算,即使客户端未连接到 Firebase 服务器。

请参阅Firebase documentation on saving data in lists、此旧版blog post on why arrays don't work well in Firebase 和此post on how push ids work。

【讨论】:

感谢您回答我的问题。但是我想问你一些事情,当我使用它创建随机键的方法时,我只是想知道是否有任何方法可以使用 javascript 创建自定义增量。就像用户添加数据时自动增加数据一样。例如第一个帖子duyuru1,第二个帖子duyuru2,等等。 最后的数字看起来像一个数组索引,因此不会缩放。我提供的链接比我在这里能更好地解释原因。如果您坚持使用自定义序列,则必须自己实现它们。 Firebase 没有对它们的内置支持。 是的,根据你给我的链接,它可以更好地使用默认属性谢谢。您的回答让我重新审视了我的应用程序。祝你有美好的一天【参考方案2】:

Firebase 建议使用分布式计数器: https://firebase.google.com/docs/firestore/solutions/counters

对于需要计数器的文档,您需要初始化一个子集合,例如 10 个文档,并在需要递增计数器时在随机分片上运行事务增量。

然后您将查询分片的集合并将它们的计数器相加。

【讨论】:

【参考方案3】:

firebase 中没有 AutoId,但这是设置为自动 id 的快速方法

例如;

1- 创建你的模型(你将把它作为模型发送到 firebase)

2-DatabaseReference firebaseDatabase;

3-firebaseDatabase =FirebaseDatabase.instance.reference();

4-firebaseDatabase.child("table_name").push().set( yourModel.toJson() );

你也可以写这样的代码来获取数据

var result= firebaseDatabase.child("table_name").once().then(
   (DataSnapshot datasnapshot)
     Map<dynamic,dynamic> values= datasnapshot.value;
     values.forEach((key,value)
       print("key:"+key+" value:"+value["name"]);
     );
   
 );
 print(result);

我试过了,效果很好

祝你有美好的一天!!!

【讨论】:

【参考方案4】:

恕我直言,我认为我们应该使用事务来保存 increment_id。请看这里:https://firebase.google.com/docs/database/web/read-and-write#save_data_as_transactions

function toggleStar(postRef, uid) 
  postRef.transaction(function(post) 
    if (post) 
      if (post.stars && post.stars[uid]) 
        post.starCount--;
        post.stars[uid] = null;
       else 
        post.starCount++;
        if (!post.stars) 
          post.stars = ;
        
        post.stars[uid] = true;
      
    
    return post;
  );

【讨论】:

【参考方案5】:

您可以将第一列键用于“USERID + Your_indexNumber(in client var)”等。

这个方法很简单。

你的桌子必须是这样的:

https://i.stack.imgur.com/k9UI6.png

【讨论】:

以上是关于使用javascript在firebase中自动增加一个值的主要内容,如果未能解决你的问题,请参考以下文章

javascript相关的增删改查以及this的理解

如何使用javascript在firebase中创建新用户

如何使用 javascript 从 Firebase 电话身份验证中删除验证码?

无法在 Glitch 上使用 Javascript 写入 Firebase 数据库

Firebase 时间戳值及查询 | JavaScript

如何使用 PHP 在 Firebase 中自动导入存储桶 - Google Cloud Storage