这是在 Firebase 中获取所有相关项的有效方法吗?

Is this a valid way of getting all relational items in firebase?

首先,我是 firebase 和非关系数据库的新手。 我已经花了几天时间来尝试找出如何有效地做到这一点。

我的fb中有以下数据结构:

{
  "Messages" : {
    "-JsG-ltFluSRQvbhY8bh" : {
      "header" : "Message Header One",
      "content" : "Message content",
      "private" : "true"
    },
    "-JsGOTpo-67v8l_3J1wr" : {
      "header" : "Message Header Two",
      "content" : "Message content",
      "private" : "true"
    }
  },
  "publicMessages" : {
    "-JsG-ltFluSRQvbhY8bh" : "true",
    "-JsGOTpo-67v8l_3J1wr" : "true"
  }
}

这是从 "Messages" 中获取所有在 "publicMessages" 中设置为 true 的项目的有效方法吗?或者有没有更有效的方法来获取它们?假设有超过 1000 public 条消息。

var messagesRef = new Firebase("https://xxx.firebaseIO.com/Messages");
var publicMessagesRef = new Firebase("https://xxx.firebaseIO.com/publicMessages");

publicMessagesRef.once("value", function(snap) {
    var keys = Object.keys(snap.val());
    keys.forEach(function(key){
        messagesRef.child(key).once("value", function(snapMsg) {
            // assign messages to $scope with $apply
        });
    });
});

/**************** 编辑

我的第一个问题得到了很好的解决方案,但我仍然不明白我是如何比较两条路径的 例如:(与原始问题相同,但路径不同)

"select" all Messages WHERE 

Message exists in users/simplelogin:3/auth_read_messages/

AND Messages/$message/private = true *(maybe this is not necessary)*

WHERE $message 是存储消息的 ID

{
  "Messages" : {
    "-JsN2eNBAg3jT3D__hCS" : {
      "auth_read" : {
        "simplelogin:2" : "true",
        "simplelogin:3" : "true"
      },
      "name" : "Message 259",
      "private" : true,
      "public" : false
    },
    "-JsNEcngthaVSxhNcmRy" : {
      "auth_read" : {
        "simplelogin:3" : "true"
      },
      "name" : "Message 907",
      "private" : true,
      "public" : false
    }
  },
  "users" : {
    "simplelogin:2" : {
      "auth_read_messages" : {
        "-JsN2eNBAg3jT3D__hCS" : true
      },
      "email" : "o@mail.se",
      "name" : "Namn Namnsson"
    },
    "simplelogin:3" : {
      "auth_read_messages" : {
        "-JsNEcngthaVSxhNcmRy" : true,
        "-JsN2eNBAg3jT3D__hCS" : true
      },
      "email" : "s@mail.se",
      "name" : "John Name"
    }
  }
}

我认为最简单,顺便说一句。最好的方法是直接在每个消息对象上设置 public 键。它更有意义,因为它是消息对象的 属性。

然后你可以这样搜索:

ref.orderByChild('public').equalTo('true').on('value', function(snapshot) {
   ...
});

您可以在此处找到更多相关信息:https://www.firebase.com/docs/web/guide/retrieving-data.html#section-queries