Firebase:如何从数据中检索存在特定键的记录?

2024-01-11

我在 firebase 中的数据如下所示:

"application": {
  "companies": {
    "firebase": {
      "creation": {
        "name": "Firebase Inc",
        "location": "USA"
      },

      "google": {
        "creattion": {
          "name": "Google Inc",
          "location": "USA"
        }
      }

      "facebook": {
      },

      "apple": {
      }
    }
  }
}

下有数万条记录companies钥匙。我如何有效地执行以下查询?

如何只查询哪个key的记录creation存在于他们的名下吗?

如何只查询没有键的记录creation以他们的名义出现?

我也想打电话.on('child_added')返回的结果集,以便我以后只能处理那些特定的记录。是否可以?


编辑:更简单的方法,无需使用额外的参数

Queries

以下是无需使用额外参数即可执行此操作的查询:

  • Find the companies without creation:
    • var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").equalTo(null);
  • Find the companies with creation:
    • var ref = new Firebase(fbUrl+'/companies').orderByChild("creation").startAt(!null);
  • 你会添加".indexOn": "creation"遵守规则。

Edit 2:我很好奇,所以我推送了 11,000 条记录到/companies2(一半与creation儿童,一半没有)。使用上述查询(或下面显示的变体之一),我能够在大约 4 秒内检索 5500 条匹配记录。

Edit 3:如果您经常运行这些查询,则将子查询分开可能是值得的/companies根据存在的情况分为两个垃圾箱creation。这样,您就可以分别读取这两个段,而无需依赖查询。

Factory

这是修改后的工厂的样子(我已经修改了PLNKR http://plnkr.co/edit/BfOXgF73s46AWTUHvXh6?p=preview匹配):

app.factory("CompaniesFactory",function($q, fbUrl){
  return function(hasCreation){
    var deferred = $q.defer();
    var ref = new Firebase(fbUrl+'/companies').orderByChild("creation");
    var query;
    if (hasCreation) {
      query = ref.startAt(!null);
      // or: 
      // query = ref.startAt(true);
    } else {
      query = ref.equalTo(null);
      // or:
      // query = ref.endAt(!null);
      // query = ref.endAt(true);
    }
    query.once("value", function(dataSnapshot){
      deferred.resolve(dataSnapshot.val());
    }, function (error) {
      deferred.reject(error);
    });
    return deferred.promise;
  }
});

是的,可以打电话.on('child_added')在返回的 dataSnapshot 上。看数据快照.ref() https://www.firebase.com/docs/web/api/datasnapshot/ref.html.


使用额外参数的原始答案:

(保留此以供参考)

另一种方法是添加另一个名为hasCreation给孩子们companies具有creation,并以此查询。

Data

  • The query would then be var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
    • If hasCreation在查询中是null,查询将返回没有的公司hasCreation child.
    • If hasCreation在查询中是true,查询将返回具有hasCreation===true.
{
  "company1" : {
    "creation" : {
      "name" : "company1"
    },
    "hasCreation" : true
  },
  "company2" : {
    "name" : "company2"
  },
  "company3" : {
    "name" : "company3"
  },
  "company4" : {
    "creation" : {
      "name" : "company4"
    },
    "hasCreation" : true
  }
}

Rules

你会添加".indexOn" : "hasCreation"按照你的规则,如下所示:

  "so:29179389":{
    ".read" : true,
    ".write" : true,
    "companies" : {
      ".indexOn" : "hasCreation"
    }
  }

公司工厂

app.factory("CompaniesFactory",function($q, fbUrl){
  return function(hasCreation){
    var deferred = $q.defer();
    if (!hasCreation) {
      hasCreation = null;
    }
    var ref = new Firebase(fbUrl+'/companies').orderByChild("hasCreation").equalTo(hasCreation);
    ref.once("value", function(dataSnapshot){
      deferred.resolve(dataSnapshot.val());
    });
    return deferred.promise;
  }
});

控制器

app.controller('HomeController',function($scope,fbUrl,CompaniesFactory) {
 $scope.getCompanies = function(hasCreation) {
  var companies = new CompaniesFactory(hasCreation).then(function(data){
     console.log(data);
     $scope.companies = data;
   });
 }
});

HTML

<body ng-app="sampleApp">
  <div ng-controller="HomeController">
    <button ng-click="getCompanies(true)">Find with creation</button>
    <button ng-click="getCompanies(false)">Find without creation</button>
    <h2>Companies:</h2>
    {{companies}}
  </div>
</body>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase:如何从数据中检索存在特定键的记录? 的相关文章

随机推荐

  • 如何在 C# 中创建基于 DataTable.Rows.Count 的对象?

    下面的所有代码仅创建两个进程 虽然我需要创建 n 个进程来打开 Chrome 浏览器并运行OpenNRowsInData user pwd 基于dtUser Rows Count因为这是动态的 我不知道为什么OpenNRowsInData
  • FFmpeg输出查找结果到Android LruCache

    亲爱的 StackOverflower 同胞 在我的 Android 应用程序中 我尝试使用以下命令快速从视频中检索帧ffmpeg android java http writingminds github io ffmpeg androi
  • Nginx 未在已启用站点中拾取站点?

    经过 10 多个小时的研究 我还没弄清楚为什么这不起作用 我正在尝试将本地主机移动到启用站点的文件夹 该文件夹位于 etc nginx sites enabled default 中 它是来自站点可用文件夹的符号链接 使用以下配置时 使用
  • C++ 区分单击和双击

    我有一个应用程序 其中双击图像视图区域会更改图像视图的布局 另外 单击一下 图像上就会放置一个点 我的问题是 双击时这两个功能都可以工作 我当然知道 当双击发生时 控件首先转到 LButtonDown 我不希望点功能在双击时起作用 我已经为
  • Angular UI-Router 在一种状态下有更多可选参数

    如何在不使用查询字符串且仅使用一个路由名称的情况下向我的路由允许可选参数 我目前将每条路线指定五次 以允许任意部分组合 所有部分都必须是可选的 路线必须解决任何变化 state login url login templateUrl log
  • 如何验证PayPal Webhook签名?

    验证从 PayPal 收到的 Webhook 时遇到问题 可用的示例并不多 集成商也没有足够的加密知识来完成任务 遵循的指南是网络钩子通知 https developer paypal com docs integration direct
  • Python Tkinter 应用程序适合屏幕

    我在我的 17 上使用 Python 的 Tkinter 模块设计了一个应用程序 屏幕 有没有办法让这个应用程序适合较低分辨率的屏幕 我尝试在 14 英寸屏幕上运行它 但该应用程序不太适合 谢谢 您可以获取屏幕分辨率 然后将其输入到您的ro
  • Android:来自 xml 资源的整数

    我必须如何修改我的 XML 资源 或者我必须创建什么 XML 文件 才能以与访问字符串值相同的方式访问整数值R string some string resource 例如 在代码中我想说 ProgressDialog progressBa
  • Webdriver 未在远程 IE 中找到元素

    我在网络驱动程序方面遇到了一个奇怪的问题 我有一个本地环境和一个远程环境来执行我的测试 它们在 Firefox 的两种环境中都可以很好地工作 但对于 Internet Explorer 8 它们只能在本地工作 每当我对远程服务器运行测试时
  • 属性和函数或过程之间的区别

    我们可以说 type TPerson class private pName string public property Name string read pName write pName end 等于 type TPerson cla
  • 如何在 python 函数中传递对象实例作为参数?

    我刚刚开始学习Python 并且对如何传递对象的实例作为函数的参数感到困惑 下面是我为练习编写的一点代码 基本思想是有一个车库 这个车库不包含汽车 您可以将汽车添加到车库并查看其详细信息 class Garage cars def add
  • SparkSQL+Hive+Hbase+Hbase集成不起作用

    当我尝试连接配置单元表 正在使用 时出现错误 通过 Hbase 集成创建 在 Spark 中 我遵循的步骤 Hive表创建代码 CREATE TABLE test sample id string name string STORED BY
  • 如何计算字典列表中特定字典键的出现次数

    我正在尝试计算指定键在我的字典列表中出现的次数 我用过Counter and most common n 计算所有键的数量 但如何找到特定键的数量 我有这段代码 目前不起作用 def Artist Stats self artist pic
  • 接收 org.openqa.selenium.WebDriverException:无法在 PATH 中找到 firefox 二进制文件,在带有 Webdriver 播放功能的 Selenium IDE 中运行测试

    当我尝试在 Selenium IDE 中使用 Webdriver 回放运行测试时 我不断收到以下错误 Caused by org openqa selenium WebDriverException Cannot find firefox
  • 使用 Perl 解析 HTML 页面的正则表达式链接 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Perl 从 HTML 中删除外部链接 https stackoverflow com questions 1598053 how can i remove external links f
  • 可以在 Final 块的中间引发 ThreadAbortException 吗?

    假设以下代码在单独的线程中运行 try var stuffToDispose new SomeClassThatNeedsDisposing doing thing with stuffToDispose finally if stuffT
  • $HOME/.local 的用途是什么

    我注意到我有 HOME local在我的机器上 似乎这个目录主要包含与 python 相关的内容 here http termbin com vw35是完整的列表吗 有点长 我想问这个目录是哪个动作创建的 我想是pip install us
  • 使用 VB.NET 访问 %appdata%

    如何通过VB NET访问 appdata 中的文件 例如 C Users Kuzon AppData Roaming program 如果是在另一台 Windows 7 计算机上 我该如何访问该文件 另外 在 Windows XP 上您将如
  • 如何在 EXT-GWT 中拆分面板?

    我在用着ext gwt http www sencha com products gwt 并且不知道如何分割面板 以便我有 2 个小部件 可调整大小的分割器的每一侧各一个 两个小部件的高度均为 100 宽度可变 本质上 我想要的是这样的 W
  • Firebase:如何从数据中检索存在特定键的记录?

    我在 firebase 中的数据如下所示 application companies firebase creation name Firebase Inc location USA google creattion name Google