在Flutter中使用get()时,如何只从Firebase RTDB返回主键,而不返回存储的其余数据



我的菜单项树如下所示:

menuItem
J1
-description:"Tasty milk shake!"
-img:"assets/images/milkshake.JPG"
-itemName:"Milk Shake"
-price:20
-varieties
-var1:"Chocolate"
-var2:"Vanilla"
-var3:"Strawberry"

我只想获得项目ID(J1、J2、J3等(,但不想获得所有信息,如"项目名称">

final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();
final items = await _dbRef.child('menuItem').get();
if (items.exists) {
String? itemID = items.value.toString();
}

items.values返回项目的所有信息,items.key仅返回"menuItem"。

我怎么能只拿到身份证?

通过客户端SDK完成的实时数据库查询是深度它们总是返回整个子树

这是与Firestore的一个关键区别,Firestore的查询是:它们只返回特定集合或集合组中的文档,不返回子集合数据。

然而,使用实时数据库REST API,您可以使用名为shallow的查询参数;限制在某个位置返回的数据的深度";。我从来没有用过,但它似乎能满足你的要求。


另一个解决方案是取消数据的规范化,并与菜单项并行维护特定DB节点中的菜单ID列表。

正如Renaud在回答中所解释的,Firebase实时数据库SDK中的所有读取操作都返回树的完整分支,不能仅用于读取密钥。

也就是说,你可以只使用你读取的数据中的密钥:

final DatabaseReference _dbRef = FirebaseDatabase.instance.ref();
final items = await _dbRef.child('menuItem').get();
items.forEach((child) => {
console.log(child.key);
})

以上内容仍然会检索数据库的整个menuItem分支,但只显示该节点下的键(因此J1来自您共享的示例(。

最新更新