Firebase equalto动态嵌套子级

Firebase equalto动态嵌套子级,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,结构为 /archive: { $userId: { $archiveKey: { foo: 1 }, ... }, ... } 其中,$userId引用一个用户id,$archiveKey是动态的,由.push()创建 是否可以查询archiveref并获取所有archiveObjects,其中foo=1?或者我需要取下整个表,手动挖掘$userId并提取我要查找的archiveObjects?Firebase查询现在可以查询嵌套路径,但路径不

结构为

/archive: {
  $userId: {
    $archiveKey: {
      foo: 1
    },
    ...
  },
  ...
}
其中,
$userId
引用一个
用户id
$archiveKey
是动态的,由
.push()
创建


是否可以查询
archive
ref并获取所有
archiveObjects
,其中
foo=1
?或者我需要取下整个表,手动挖掘
$userId
并提取我要查找的
archiveObjects

Firebase查询现在可以查询嵌套路径,但路径不能是动态的

因此,如果您知道uid,可以通过以下方式查询该用户的存档:

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...
ref.child('archiveCategories/foo/1').once('value', function(keys) {
  keys.forEach(function(key) {
    ref.child('archives').child(key.key()).once('value', function(snapshot) {
      console.log(snapshot.val());
    });
  };
});
如果您不知道uid,则必须创建一个允许您进行查找的数据结构:

archive_category_to_uids: {
  foo: {
    1: {
      uid1: true,
      uid2: true
    }
  }
}
一种更常见的方法是将归档文件分为自己的顶级列表,并让用户和类别都引用该列表:

users: {
  userId1: {
    archiveKey1: true,
    ...
  },
  ...
},
archives: {
  archiveKey1: {
    foo: 1,
    uid: uid1
  },
  ...
},
archiveCategories: {
  foo: {
    1: {
      archiveKey1: true,
      archiveKey2: true
    }
  }
}
现在,您可以通过以下方式查找归档文件:

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...
ref.child('archiveCategories/foo/1').once('value', function(keys) {
  keys.forEach(function(key) {
    ref.child('archives').child(key.key()).once('value', function(snapshot) {
      console.log(snapshot.val());
    });
  };
});

这个过程称为非规范化,在NoSQL数据库中非常常见。您正在对数据进行建模,以了解应用程序需要如何使用数据。有关此模式和其他常见模式的更多信息,我建议阅读此内容。

Firebase查询现在可以查询嵌套路径,但路径不能是动态的

因此,如果您知道uid,可以通过以下方式查询该用户的存档:

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...
ref.child('archiveCategories/foo/1').once('value', function(keys) {
  keys.forEach(function(key) {
    ref.child('archives').child(key.key()).once('value', function(snapshot) {
      console.log(snapshot.val());
    });
  };
});
如果您不知道uid,则必须创建一个允许您进行查找的数据结构:

archive_category_to_uids: {
  foo: {
    1: {
      uid1: true,
      uid2: true
    }
  }
}
一种更常见的方法是将归档文件分为自己的顶级列表,并让用户和类别都引用该列表:

users: {
  userId1: {
    archiveKey1: true,
    ...
  },
  ...
},
archives: {
  archiveKey1: {
    foo: 1,
    uid: uid1
  },
  ...
},
archiveCategories: {
  foo: {
    1: {
      archiveKey1: true,
      archiveKey2: true
    }
  }
}
现在,您可以通过以下方式查找归档文件:

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...
ref.child('archiveCategories/foo/1').once('value', function(keys) {
  keys.forEach(function(key) {
    ref.child('archives').child(key.key()).once('value', function(snapshot) {
      console.log(snapshot.val());
    });
  };
});

这个过程称为非规范化,在NoSQL数据库中非常常见。您正在对数据进行建模,以了解应用程序需要如何使用数据。有关此模式和其他常见模式的更多信息,我建议您阅读此内容。

Firebase中没有标准的查询系统,您需要对数据进行结构化,以便能够执行应用程序所需的读取。所以,是的,你需要手动挖掘或者找到一个适合你需要的数据结构,这只是部分正确。您已经深入嵌套在静态子级上,如
orderByChild('child1/child2')
。我的问题是,这是否也适用于动态子对象。Firebase中没有标准的查询系统,您需要对数据进行结构化,以便能够执行应用程序所需的读取。所以,是的,你需要手动挖掘或者找到一个适合你需要的数据结构,这只是部分正确。您已经深入嵌套在静态子级上,如
orderByChild('child1/child2')
。我的问题是,这是否也适用于动态子级。这非常有趣,但是在您上次的查询中,您实际上正在执行
存档数
查询数,但我想我必须花时间来确定这是否值得以手动方式获取整棵树并对其进行解析。非常感谢。最后一段代码中的
once()
不是查询。这是一种直接查找,速度非常快。这是非常有趣的,但是在你上次的查询中,你实际上是在做
归档数量
查询数量,但是我想我必须花时间来确定这是否值得让整个树下来并手动解析它。非常感谢。最后一段代码中的
once()
不是查询。这是一种直接查找,速度非常快。看见