繁体   English   中英

Firebase-具有equalTo的深度查询orderByChild

[英]Firebase - Deep Query orderByChild with equalTo

我试图抓住其中每个成员的每个项目-尽管实际结构要大得多(因为很难重构数据库),但我创建了一个示例数据结构。

这是我的查询:

var ref = new Firebase(FBURL + '/chat/meta/project');

var email = 'kerry@email.com';

ref
    .orderByChild("email")
    .equalTo(email)
    .on("child_added", function(snapshot) {
        console.log(snapshot.val());
    }
);

重要的是要注意,如果删除.equalTo(email) ,它将返回所有“项目”,而当它仅返回其中的2个时。

这是Firebase中的数据:

{
  "chat" : {
    "meta" : {
      "project" : {
        "-KAgjWOxjk80HIbNr68M" : {
          "name" : "Gman Branding",
          "url" : "http://localhost:3000/project/abc123fasd123cc/...",
          "date" : "2015-10-10T21:33:25.170Z",
          "member" : {
            "-KAgkD-2GVESwNwKP3fA" : {
              "email" : "abc@gman.com"
            },
            "-KAgkP3M4nug9Bjn-vY6" : {
              "email" : "def@gman.com"
            },
            "-KAgkP3OF0sUgc9x9p37" : {
              "email" : "ghi@gman.com"
            },
            "-KAgkaMyEOiXft6o-HbO" : {
              "email" : "kerry@email.com"
            }
          }
        },
        "-KAgl9xlPDU5T4072FgE" : {
          "-KAglqH9pxkhgC84_kAl" : {
            "name" : "YuDog",
            "url" : "http://localhost:3000/project/abc123fasd123cc/...",
            "date" : "2015-10-10T21:41:31.172Z"
          },
          "name" : "billing test 1",
          "url" : "http://localhost:3000/project/abc123fasd123cc/...",
          "date" : "2015-02-25T23:18:55.626Z",
          "dateNotifyUnread" : "2016-01-25T23:23:55.626Z",
          "member" : {
            "-KAglNsswyk66qUZNrTU" : {
              "email" : "kerry@email.com"
            }
          }
        },
        "-KAgltmLk2oOYhEDfwRL" : {
          "-KAgm1Jt5q53gzLm1GIh" : {
            "name" : "YuDog",
            "url" : "http://localhost:3000/project/abc123fasd123cc/...",
            "date" : "2015-10-10T21:41:31.172Z"
          },
          "name" : "YuDog",
          "url" : "http://localhost:3000/project/abc123fasd123cc/...",
          "date" : "2015-10-10T21:41:31.172Z",
          "member" : {
            "-KAgm1Jvss9AMZa1qDb7" : {
              "email" : "joe@yudog.com"
            }
          }
        },
        "-KAgluTcE_2dv00XDm1L" : {
          "-KAgm6ENmkpDiDG2lqZ4" : {
            "name" : "YuDog Landing Page",
            "url" : "http://localhost:3000/project/abc123fasd123cc/...",
            "date" : "2015-10-10T21:41:31.172Z"
          },
          "-KAgmBptbeInutRzNinm" : {
            "name" : "YuDog Landing Page",
            "url" : "http://localhost:3000/project/abc123fasd123cc/...",
            "date" : "2015-10-10T21:41:31.172Z"
          },
          "name" : "YuDog Landing Page",
          "url" : "http://localhost:3000/project/abc123fasd123cc/...",
          "date" : "2015-10-10T21:41:31.172Z",
          "member" : {
            "-KAgm6EQcvQg3oP-OnIF" : {
              "email" : "joe@yudog.com"
            },
            "-KAgmBpwoxPYGXS9fLZ9" : {
              "email" : "joe@yudog.com"
            }
          }
        }
      }
    }
  }
}

我看过SO上的8-10个其他链接,但没有找到能解决此问题的任何链接。

解决方案是创建符合您需求的数据结构。 在这种情况下,您要基于用户的电子邮件地址查找项目。 因此,我们将添加一个包含此映射的节点:

"projects_by_email": {
  "kerry@email,com": {
    "-KAgjWOxjk80HIbNr68M": true,
    "-KAgl9xlPDU5T4072FgE": true
  },
  "abc@gman,com": {
    "-KAgjWOxjk80HIbNr68M": true
  }
  ...
}

这称为对数据进行非规范化,尽管我经常将它们视为反向索引。 我可能会使用uid保留项目,但结构将相同。

通过这样的结构,您可以通过简单的直接查找来获取电子邮件的项目列表:

var ref = new Firebase(FBURL);
var email = 'kerry@email.com';
ref.child('projects_by_email')
   .child(email)
   .on("child_added", function(snapshot) {
       console.log(snapshot.key());
   }
);

或者,如果您还想“加入”项目本身:

var ref = new Firebase(FBURL);
var email = 'kerry@email.com';
ref.child('projects_by_email')
   .child(email)
   .on("child_added", function(snapshot) {
       ref.child('project').child(snapshot.key()).once('value', function(projectSnapshot) {
           console.log(projectSnapshot.val());
       });
   }
);

这种类型的非规范化是NoSQL数据建模的常规部分。 重复可能会造成浪费,但这是NoSQL解决方案如此出色的部分原因:上面的代码都没有要求数据库考虑所有项目/所有用户。 全部都是直接访问正确的节点,因此扩展性非常好。 因此,我们正在牺牲存储空间来提高性能/可扩展性。 典型的空间与时间的权衡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM