Firebase 等于动态嵌套子项

Firebase equalto dynamic nested child

结构为

/archive: {
  $userId: {
    $archiveKey: {
      foo: 1
    },
    ...
  },
  ...
}

其中 $userId 引用 user id 并且 $archiveKey 是动态的,由 .push() 创建。

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

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

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

ref.child(authData.uid).orderByChild('foo').equalTo(1).on(...

如果您不知道 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('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 数据库中很常见。您正在为您的应用程序需要如何使用它的数据建模。有关此模式和其他常见模式的更多信息,我建议阅读此 article on NoSQL data modeling.