【问题标题】:How to query firebase realtime database in cloud code如何在云代码中查询 Firebase 实时数据库
【发布时间】:2017-08-06 02:28:41
【问题描述】:

我正在使用 Firebase 云代码和 Firebase 实时数据库。

我的数据库结构是:

 -users
       -userid32
       -userid4734
          -flag=true  
       -userid722
          -flag=false
       -userid324

我只想查询 'flag' 字段为 'true' 的用户。

我目前正在做的是检查所有用户并一一检查。但是这样效率不高,因为我们数据库中有很多用户,函数运行需要10多秒:

const functions = require('firebase-functions');
const admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);

exports.test1 = functions.https.onRequest((request, response) => {
    // Read Users from database
    //
    admin.database().ref('/users').once('value').then((snapshot) => {
        var values = snapshot.val(),
            current, 
            numOfRelevantUsers,
            res = {};       // Result string

            numOfRelevantUsers = 0;

        // Traverse through all users to check whether the user is eligible to get discount.
        for (val in values) 
        {
            current = values[val]; // Assign current user to avoid values[val] calls.

            // Do something with the user
        }

        ...
});

是否有更有效的方法来进行此查询并仅获取相关记录? (并且没有得到所有这些并一一检查?)

【问题讨论】:

    标签: node.js firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    您将为此使用 Firebase 数据库查询:

    admin.database().ref('/users')
        .orderByChild('flag').equalTo(true)
        .once('value').then((snapshot) => {
        const numOfRelevantUsers = snapshot.numChildren();
    

    当您需要遍历子节点时,请不要将生成的快照视为普通的 JSON 对象。虽然这可能在这里起作用,但当您对具有实际范围的值进行排序时,它会产生意想不到的结果。而是使用内置的Snapshot.forEach() 方法:

    snapshot.forEach(function(userSnapshot) {
      console.log(userSnapshot.key, userSnapshot.val());
    }
    

    请注意,所有这些都是相当标准的 Firebase 数据库使用,因此我建议您在 Web SDKAdmin SDK 的文档中花一些额外的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2019-05-07
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多