为标记搜索归一化Firebase数据

时间:2016-12-03 20:55:39

标签: javascript angularjs firebase ionic-framework firebase-realtime-database

我有以下数据结构,并希望返回与标记关联的“产品”。是否有可能通过当前的数据结构实现这一目标?如果没有,我应该如何构建数据,以及返回所有具有“Tag 2”的“产品”的查询是什么样的?

{
  "accounts" : {
    "-KRPU3FyKT4oPWHYjDrr" : {
      "userId" : "1"
    },
    "-kjnsvakljsndfme;lnmv" : {
      "userId" : "2"
    }
},

  "products" : {
    "-KXcnfob3Vo3s8bL9WSI" : {
      "name" : "Product 1",
      "description" : "Description of product 1",
      "tags" : [ "Tag 1", "Tag 2", "Tag 3", "etc." ],
      "url" : "websiteURL1.com",

    },
    "-KXcnfob3Vo3s8bL9WSI" : {
      "name" : "Product 2",
      "description" : "Description of product 2",
      "tags" : [ "Tag 1", "Tag 2", "Tag 3", "etc." ],
      "url" : "websiteURL2.com",

    }
  }
}

我的最后一次尝试是:

firebase.database().ref.child('products').orderByChild('tags').equalTo("Tag 1").once('value', function(products)

显然没有成功.. 但是,这确实会返回带有标签的所有“产品”:

firebase.database().ref.child('products').orderByChild('tags').once('value', function(products)

提前致谢!

1 个答案:

答案 0 :(得分:7)

如果您按照以下方式重组数据:

"products" : {
  "-KXcnfob3Vo3s8bL9WSI" : {
    "name" : "Product 1",
    "description" : "Description of product 1",
    "tags" : {
      "Tag1": true,
      "Tag2": true
    },
    "url" : "websiteURL1.com"
  },
  "-KXcnfob3Vo3s8bL9WSI" : {
    "name" : "Product 2",
    "description" : "Description of product 2",
    "tags" : {
      "Tag3": true,
      "Tag4": true
    },
    "url" : "websiteURL2.com"
  }
}

您可以使用深层路径查询来获取具有特定标记的产品:

firebase.database()
  .ref('products')
  .orderByChild('tags/Tag1')
  .equalTo(true)
  .once('value', function (products) {
    console.log(products.val());
  });

请注意,只有当您拥有固定数量的已知标记时,此方法才有效,因为每个标记都需要索引。